Javascript CKEditor-删除DOM节点后销毁实例
通过阅读,我看到他们可以选择使用Javascript CKEditor-删除DOM节点后销毁实例,javascript,ajax,ckeditor,wysiwyg,Javascript,Ajax,Ckeditor,Wysiwyg,通过阅读,我看到他们可以选择使用CKEDITOR.instances.instanceName.destroy()销毁实例。但是,如果DOM已更改,并且整个WYSIWYG DOM结构已被删除,则在Chrome中会出现以下错误: Uncaught TypeError: Cannot read property 'document' of null …以及Firefox中的以下内容: i.contentWindow is null 有办法解决这个问题吗 由于我的应用程序的结构(通过AJAX加载内
CKEDITOR.instances.instanceName.destroy()销毁实例代码>。但是,如果DOM已更改,并且整个WYSIWYG DOM结构已被删除,则在Chrome中会出现以下错误:
Uncaught TypeError: Cannot read property 'document' of null
…以及Firefox中的以下内容:
i.contentWindow is null
有办法解决这个问题吗
由于我的应用程序的结构(通过AJAX加载内容),当元素仍在页面上时,我无法调用.destroy()
。您可以在上应用其中一个修补程序,它将正常工作。我建议这样做:如果需要在AJAX调用后销毁DOM中的ckeditor对象和元素,可以通过将布尔参数设置为函数调用destroy(true)来完成。这样,它就不会尝试更新DOM:
var editor = CKEDITOR.instances[name];
if (editor) { editor.destroy(true); }
CKEDITOR.replace(name);
我已经编写了两个函数来更好地控制这些东西。请注意,在使用这些函数之前,我已经声明了一个变量,但是有很多更巧妙的方法,但是这种方法对于我需要它的目的来说已经足够好了(我使用并且只需要一个实例):
我还检查应该替换的HTML元素是否存在,这样我就不会收到错误消息。在弹出对话框中将CKEDITOR集成到GWT中时出现问题。销毁对话框时,CKEDITOR引发此错误-“无法读取null的属性“document”。解决方案是在关闭对话框之前销毁CKEDITOR。(我们必须扩展GWT ckeditor类以覆盖它—使用Erik提供的editor.destroy(true)语法—谢谢,Erik!)我对命令行有点陌生;如何应用此修补程序?我正在Windows 7 x64上运行。这样做可能太复杂了。我的工作方式是拥有一个SVN副本,使用TortoiseSVN很容易,然后使用文件夹上的上下文菜单使用补丁选项,然后必须重新打包所有的CKEditor代码(因此还需要安装Java)。遗憾的是,仅仅因为他们不喜欢这个补丁,并提出了一些更复杂的建议,但最终还没有添加。因为我没有使用SVN,所以我查看了补丁
文件,并手动进行了所有这些更改。现在,所有这些更改都在\u source
文件夹下。我假设ckeditor.js
是以某种方式从所有这些文件编译/连接/压缩的。我该怎么做呢?这篇文档解释了压缩:虽然它声明有一个exe,但似乎你仍然需要Java环境,所以我会忘记它。这一切都成功了。我认为您不需要带有exe
的Java环境。这为我解决了一个类似的(相同的?)问题(基于AJAX调用的返回替换ckeditor),但我仍然得到了未捕获的TypeError(与OP中的相同)。我不确定是否有任何副作用,但我想摆脱错误信息。我加载编辑器的代码是:window.makeCkEditor=function(e,w,h){var cki,config,ei;ei=CKEDITOR.instances[e];if(ei)ei.destroy(true);config={width:w,height:h};return cki=CKEDITOR.replace(e,config);}
关于如何摆脱msg有什么想法吗?@KenThompson:我有一点不同的方法,但是你在AJAX调用之前尝试过销毁ck对象吗?刚刚遇到了这个问题,正如承诺的那样,detroy(true)努力解决了这个问题。非常感谢。没问题,很高兴我能帮忙
if(typeof(editor) == 'undefined')
var editor=null;
function ck_delete(editor)
{
if(typeof(editor) != 'undefined' && editor!=null)
editor.destroy();
}
function ck_init(ck_inst_name)
{
var el_id=document.getElementById(ck_inst_name);
if(typeof(el_id) != 'undefined' && el_id!=null)
{
if(typeof(editor) == 'undefined' || editor==null)
{
editor=CKEDITOR.replace( ck_inst_name );
}
else
{
ck_delete(editor);
editor=null;
editor = CKEDITOR.replace( ck_inst_name );
}
}
}