编辑:请参阅我对发现的问题和解决方案的回答。这是由于iframe调用上下文,尽管是同一域
我不明白为什么会发生这个错误。我正在经历以下步骤:
-
删除tinyMCE编辑器
-
更改文本区域的id
-
将tinymce编辑器添加到具有新id 的文本区域
代码
//Remove the tinyMCE editor for this text area (CHANGING TO "true" DOESN't HELP)
tinyMCE.EditorManager.execCommand('mceRemoveControl',false, myTextArea.id );
//Change the id
myTextArea.id = newId;
//Add a tiny mce editor (CHANGING TO "true" DOESN't HELP)
tinyMCE.EditorManager.execCommand('mceAddControl',false, newId);
最后一个抛出错误the operation is insecure
。为什么?我该怎么做?
对于任何面临类似问题的人,以下是问题所在以及我是如何解决的:
问题
-
我向同一域的iframe提交了一个表单(因为它有文件输入,我不能使用ajax)
-
然后iframe在父窗口中调用一个方法,让它知道它已经完成了:
window.parent.myObject.handleResponse( {} );
-
在方法
handleResponse
中,我删除并添加了tinymce编辑器。
问题是tinymce创建了自己的iframe,所以即使它是同一个来源/域,而不是交叉来源,浏览器(Firefox)还是拒绝了它,因为它是一个不安全的操作,子框架调用在另一个iframe中执行某些操作的父窗口的方法。尽管它们都是同一个域,但调用上下文不允许这样做。
解决方案
-
在将表单提交到iframe之前,请通过
setInterval
启动一个"观察程序",检查要设置的响应值。 -
让
window.parent.myObject.handleResponse( {} );
简单地设置响应值 -
当观察程序(在父窗口的上下文中启动)看到变量已设置时,它可以更改所有的tinymce编辑器。