2013-05-16 115 views
1

我很困惑。JavaScript对象属性“有时”未定义

我创建了以下脚本,它位于http://tapmeister.com/test/dom.html。由于某些未知原因,tinymce.editors.ta1和tinymce.editors [0]显示为未定义,并尝试使用它们下方的方法会导致错误。但是当我使用FireBug检查tinymce或tinymce.editors时,我在DOM中看到它们。

所以,我创建了一个jsfiddle http://jsfiddle.net/JWyWM/以显示在stackoverflow上的人。但是当我测试它时,tinymce.editors.ta1和tinymce.editors [0]不再是未定义的,并且这些方法没有错误地工作。

这是怎么回事?也许与公共/保护/私人财产有关?如何访问tinymce.editors.ta1.hide()等方法?谢谢!!!

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" /> 
     <title>Testing</title> 
     <script src="http://tinymce.cachefly.net/4.0/tinymce.min.js"></script> 
     <script type="text/javascript"> 
      tinymce.init({selector: "textarea#ta1"}); 
      tinymce.init({selector: "textarea#ta2"}); 
      console.log(tinymce); 
      console.log(tinymce.editors); 
      console.log(tinymce.editors.ta1); 
      console.log(tinymce.editors[0]); 
      //tinymce.editors.ta1.hide(); 
      //alert('pause'); 
      //tinymce.editors.ta1.show(); 
     </script> 
    </head> 

    <body> 
     <form> 
      <textarea id="ta1"></textarea> 
      <textarea id="ta2"></textarea> 
     </form> 
    </body> 
</html> 

回答

3

当您致电init时,TinyMCE不会立即完成所有设置工作。它提供了一个回调,setup,告诉你工作完成的时间。

因此,如果您提供setup回调,则可以与编辑器实例进行交互。

下面是一个例子(我也动了你的脚本,到最后,which is best practice regardless):

Live Example |现在Live Source

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" /> 
     <title>Testing</title> 
    </head> 

    <body> 
     <form> 
      <textarea id="ta1"></textarea> 
      <textarea id="ta2"></textarea> 
     </form> 
     <script src="http://tinymce.cachefly.net/4.0/tinymce.min.js"></script> 
     <script type="text/javascript"> 
      tinymce.init({ 
       selector: "#ta1, #ta2", 
       setup: function(e) { 
        console.log("Editor " + e.id + " is ready"); 
       } 
      }); 
     </script> 
    </body> 
</html> 

,如果你想真正进入编辑器实例,奇怪的是TinyMCE的不将其添加到tinymce.editors直到后调用setup功能。但是,如果你投入一个短暂的收益,你就全部成立。以上是更改后的setup功能:

Live Copy | Live Source

setup: function(e) { 
    // Bizarrely, TinyMCE calls `setup` *before* adding 
    // the relevant editor to `tinymce.editors`, 
    // so we have to yield briefly 
    console.log("Editor " + e.id + " is ready"); 
    if (e.id === "ta2") { 
    console.log("It's ta2, I'll hide it in a moment."); 
    setTimeout(function() { 
     tinymce.editors[e.id].hide(); 
    }, 0); 
    } 
} 

那么为什么它在jsFiddle上工作?那么,jsFiddle有一个真的脑残出人意料的默认设置,这是把你的所有脚本放在一个window#load回调函数中。 window#load发生时在加载完成后,所有的外部资源都加载完毕。 (你可以看到在jsFiddle UI中,它是左边的第二个下拉列表)。显然,TinyMCE已经完全准备好了,在那里它并不是在这个循环中的早期阶段。

备注:99.9%的时间,在提供带id选择器的标签名称时,绝对没有任何意义。 textarea#ta1id值是唯一的,所以你不必限定它们,除非你明确地想要避免匹配有时可能有一个标签名称的元素,或者其他时候有另一个元素,这是一个非常不寻常的用例。

+0

我按照你的建议修改了代码,结果没有什么不同。请看看http://tapmeister.com/test/dom.html。谢谢 – user1032531

+0

@ user1032531:不,不要求人们访问随机站点来帮助你。我们不把这些东西放在场外。 (为什么:meta.stackoverflow.com/questions/118392/add-stack-overfow-faq-entry-or-similar-forputing-code-in-the-question)然而,我已经找出了问题所在。查看更新的答案。 –

+0

对不起TJ,我不会再做。我将采取措施学习使用http://jsbin.com。另外,我同意'textarea#ta1'的无用性。它实际上是在TinyMCE的例子中。感谢您向我展示我可以使用'selector:“#ta1,#ta2”'。最后,我不认为修改后的解决方案有效。我需要能够访问编辑器方法,比如'tinymce.editors.ta1.hide()'。我将在http://jsbin.com上创建一个示例并发布。感谢您的帮助 – user1032531

-1

在tinyMCE实际加载之前,脚本运行的可能性很大。它可能是这样的情况,它从你的测试网站加载得更快,所以这就是它工作的原因。

用作快速检查。

相关问题