CKEditor - 删除DOM节点时销毁实例

时间:2011-11-01 02:59:51

标签: javascript ajax ckeditor wysiwyg

通过CKEditor documentation阅读,我发现他们可以选择使用CKEDITOR.instances.instanceName.destroy();销毁实例。但是,如果DOM已更改,并且已删除整个WYSIWYG DOM结构,则Chrome中会出现以下错误:

Uncaught TypeError: Cannot read property 'document' of null

...以及Firefox中的以下内容:

i.contentWindow is null

有什么方法可以解决这个问题吗?

由于我的应用程序的结构方式(通过AJAX加载内容),当元素仍在页面上时,我无法调用.destroy()

3 个答案:

答案 0 :(得分:16)

如果你需要在AJAX调用之后销毁DOM中的ckeditor对象和elemnet,你可以通过在函数调用destroy(true)中设置一个布尔参数来实现。这样它就不会尝试更新DOM:

var editor = CKEDITOR.instances[name];
if (editor) { editor.destroy(true); }
CKEDITOR.replace(name);

我已经编写了2个函数来更好地控制这些东西。请注意,在使用这些函数之前我已经声明了一个变量,但是有很多方法,但这种方法足以满足我需要的目的(我使用并且只需要一个实例):

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

我还检查是否存在应该替换的HTML元素,因此我没有收到错误消息。

答案 1 :(得分:2)

您可以在http://dev.ckeditor.com/ticket/8226处应用其中一个补丁,它会起作用。我建议这个:http://dev.ckeditor.com/attachment/ticket/8226/8226_5.patch

答案 2 :(得分:1)

我们在一个弹出对话框中将CKEDITOR集成到GWT中时遇到了这个问题。当对话框被销毁时,CKEDITOR引发了这个错误 - “无法读取null的属性'文档'。”解决方案是在关闭对话框之前销毁CKEDITOR。 (我们必须扩展GWT ckeditor类以覆盖它 - 使用Erik给出的editor.destroy(true)语法 - 谢谢,Erik!)