2012-03-20 79 views
1

我们试图从DOM中获取tinyMCE对象以设置文本,但不幸的是,当我们在页面中注入JavaScript代码时,它不工作,而相同的代码在Javascript Console中完美执行(铬)。javascript对象的DOM奇怪问题

的代码如下:

<script language="javascript"> 
var testing = 'test'; 
var curFrames; 
var curUrl; 
var mFrames; 
var cFrame; 
var editor; 
var editor2; 

window.onload=CodeOnLoad ; 

//Javascript that runs on load 
function CodeOnLoad() { 
    curFrames=document.getElementsByTagName("frame"); 


curFrames[0].onload = function() { 
    curUrl= curFrames[0].contentDocument.getElementById("the_iframe").src; 
    console.log(curUrl) 

    if (curUrl.indexOf("post")!=-1) 
    { 
    mFrames=document.getElementsByTagName("frame"); 
    cFrame = mFrames[0].contentDocument.getElementById('the_iframe'); 
    editor = cFrame.contentWindow.tinymce; 
    editor2 = editor.activeEditor; 
    } 
} 
} 
</script> 

上面的代码将允许我们使用:

editor.activeEditor (which will return the correct editor object) // Only when we test it in the Browser Javascript console 

同时:

editor2 = editor.activeEditor; (the last line of the code - will return null) 
+0

确定的编辑框已经尝试访问'editor.activeEditor'时加载?它看起来像你试图访问尚未加载的对象 - 你需要对iframe进行一些onload回调。 – nrabinowitz 2012-03-20 17:23:32

回答

0

有两件事情需要注意的:

  1. 当父窗口完成加载时,绝对不能保证iframe内部的内容已完成加载。

  2. 如果iframe的源从不同的域加载,则无法访问iframe的属性(如contentWindow或contentDocument)。

+0

根据第一个问题。是否有可能有另一个onload函数的内部iframe? – glarkou 2012-03-20 17:58:37

+0

@salamis我注意到的一件事是,你在一些地方称你的元素为“框架”,在其他地方称为“iframe”。这些不是相同的节点类型。 getElementsByTagName('frame')不会返回iframe。 – jbabey 2012-03-20 18:03:28

1

对于您的使用场景,有tinymce配置设置setup加上onInit处理程序。

此外:

editor = cFrame.contentWindow.tinymce; 
editor2 = editor.activeEditor; 

不会以这种方式工作。

我会告诉你如何设置正确:

setup : function(ed) { 

    ed.onInit.add(function(ed, event) { 
      // do all you want to do after the editor has loaded here 
      var my_window = ed.getWin(); 
      var my_document = ed.getDoc(); 

    }); 
}); 
+0

我应该把那个放在哪里?不幸的是,我想修改Moodle里面的tinymce – glarkou 2012-03-25 23:12:08

+0

tinymce配置应该存储在一个名为tinymce.js.php的文件中 – Thariama 2012-03-26 07:39:45

+0

感谢您的回复。我试图找到该文件,但它不在那里。我正在使用Moodle 2.2。 – glarkou 2012-03-26 11:11:25