CKEditor实例已存在

jac*_*erg 97 javascript ckeditor

我正在使用jquery对话框来呈现表单(通过AJAX获取).在某些形式上,我使用CKEditor作为textareas.编辑器在第一次加载时显示正常.

当用户取消对话框时,我将删除内容,以便在以后的请求中重新加载它们.问题是,一旦重新加载对话框,CKEditor声称编辑器已经存在.

uncaught exception: [CKEDITOR.editor] The instance "textarea_name" already exists.
Run Code Online (Sandbox Code Playgroud)

API包含一种销毁现有编辑器的方法,我看到人们声称这是一个解决方案:

if (CKEDITOR.instances['textarea_name']) {
CKEDITOR.instances['textarea_name'].destroy();
}
CKEDITOR.replace('textarea_name');
Run Code Online (Sandbox Code Playgroud)

这对我不起作用,因为我收到了一个新错误:

TypeError: Result of expression 'i.contentWindow' [null] is not an object.
Run Code Online (Sandbox Code Playgroud)

这个错误似乎发生在"destroy()"而不是"replace()"上.有没有人经历过这个并找到了不同的解决方案

有可能"重新渲染"现有的编辑器,而不是破坏和替换它吗?

更新 这是处理同一问题的另一个问题,但他提供了一个可下载的测试用例.

Tom*_*rda 97

要使其工作,您需要在销毁实例时传递布尔参数true:

    var editor = CKEDITOR.instances[name];
    if (editor) { editor.destroy(true); }
    CKEDITOR.replace(name);
Run Code Online (Sandbox Code Playgroud)

  • 加入了感恩的合唱团!我喜欢Stack Overflow总是通过一次搜索解决我所有的问题. (6认同)
  • "真实"的选择使一切变得不同.还值得一提的是,下面给出的"CKEDITOR.remove(instance)"答案不是一个好的解决方案,因为它是一个内部API也会产生错误,使用instance.destroy(true)总是更好. (2认同)
  • 应该有一个选项可以根据他们收到的票数对答案进行排序.所以最好的答案是最重要的. (2认同)

小智 28

function loadEditor(id)
{
    var instance = CKEDITOR.instances[id];
    if(instance)
    {
        CKEDITOR.remove(instance);
    }
    CKEDITOR.replace(id);
}
Run Code Online (Sandbox Code Playgroud)

  • 不要使用CKEDITOR.remove,因为它只清除数组中的元素,但将所有DOM留在内存中.它在文档中声明它是供内部使用的:http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.html#.remove你应该使用instace.destroy(),如madhaviaddanki所说. (18认同)
  • 遇到同样的情况并且如上所述,这个答案是不正确的.使用destroy()并传递true参数最终对我有用,如下所述. (2认同)

Min*_*ure 19

我也有这个问题,但我用更简单的方式解决了它...

我在我的jQuery脚本中使用类"ckeditor"作为我想要用于CKEditor的textareas的选择器.默认的ckeditor JS脚本也使用此类来标识要用于CKEditor的textareas.

这意味着我的jQuery脚本和默认的ckeditor脚本之间存在冲突.

我只是将textarea和我的jQuery脚本的类更改为'do_ckeditor'(你可以使用除"ckeditor"之外的任何东西)并且它有效.


adu*_*adu 11

这是对我有用的最简单(也是唯一)的解决方案:

if(CKEDITOR.instances[editorName])
   delete CKEDITOR.instances[editorName];
CKEDITOR.replace(editorName);
Run Code Online (Sandbox Code Playgroud)

删除阵列中的此条目可防止此表单安全检查破坏您的应用程序.

destroy()和remove()对我没用.


Sco*_*ttE 7

也许这会帮助你 - 我使用jquery做了类似的事情,除了我正在加载未知数量的ckeditor对象.我花了一段时间才发现这一点 - 文档中并不清楚.

function loadEditors() {
    var $editors = $("textarea.ckeditor");
    if ($editors.length) {
        $editors.each(function() {
            var editorID = $(this).attr("id");
            var instance = CKEDITOR.instances[editorID];
            if (instance) { instance.destroy(true); }
            CKEDITOR.replace(editorID);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我为了从编辑中获取内容而运行的内容:

    var $editors = $("textarea.ckeditor");
    if ($editors.length) {
        $editors.each(function() {
            var instance = CKEDITOR.instances[$(this).attr("id")];
            if (instance) { $(this).val(instance.getData()); }
        });
    }
Run Code Online (Sandbox Code Playgroud)

更新:我已经改变了我使用正确方法的答案 - 即.destroy()..remove()意味着内部,并且在某一时刻被错误地记录.


小智 5

var e= CKEDITOR.instances['sample'];
e.destroy();
e= null;
Run Code Online (Sandbox Code Playgroud)


小智 5

我有类似的问题,我们为通过ajax加载的内容制作了几个CKeditor实例.

CKEDITOR.remove()

将DOM保留在内存中并没有删除所有绑定.

CKEDITOR.instance [INSTANCE_ID] .destroy()

每当我使用来自ajax的新数据创建新实例时,都会出现错误i.contentWindow错误.但直到我发现我在清除DOM后才破坏了实例.

当实例&它的DOM出现在页面上时使用destroy(),然后它完全正常.


ner*_*rkn 5

对于ajax请求,

 for(k in CKEDITOR.instances){
    var instance = CKEDITOR.instances[k];
    instance.destroy()
 }
  CKEDITOR.replaceAll();
Run Code Online (Sandbox Code Playgroud)

此片段将删除文档中的所有实例。然后创建新实例。