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 );
            }
        }
    }