如何正确销毁CKEditor实例?

31

我在一个非常简单的页面上运行CKeditor 3.4。有时会遇到问题,即在调用 document.main_form.submit() 时,它不会发送文本区域的内容。经过一些阅读,发现 CKeditor 没有正确地销毁。我尝试在保存表单之前手动销毁它,但无法调用它。奇怪的是,有时它能正常工作,有时不能。我使用 Chrome 浏览器,可能会对事情产生影响,但在 Firefox 中也会发生同样的事情。

如何正确销毁 CKeditor,以便始终在 POST 中发送文本区域数据。谢谢!

7个回答

47

我曾经遇到过这个问题,真是太烦人了。

为了正确销毁编辑器实例,请尝试

if (CKEDITOR.instances.myInstanceName) CKEDITOR.instances.myInstanceName.destroy();

根据这里的文档:

在提交之前,将编辑器的内容分配给隐藏字段可以解决缺失内容的问题。我正在使用ASP.Net,但它应该在任何地方都适用。

在提交按钮的客户端单击处理程序中调用:

if (CKEDITOR.instances.myInstanceName)
    document.getElementById('hiddenField').value = CKEDITOR.instances.getData();

5
我怎么知道'myInstanceName'是什么?这是编辑器的ID吗? - rmcsharry

16

我曾经在使用angularjs ui-router时,为每个子视图使用了一个CKEDITOR实例。我用下面的解决方案来清除每次加载ui-view时的实例

for(name in CKEDITOR.instances)
{
    CKEDITOR.instances[name].destroy()
}

这是一个更好的解决方案。在我的情况下,每当用户访问加载编辑器的路由时,实例名称都会更改...从editor1到editor2等等。由于我无法轻松预测实例名称,像这样循环遍历它们所有的方式是有效的。谢谢! - rmcsharry

9
在我的情况下
CKEDITOR.instances.myInstanceName.destroy();

这并没有帮助,因为我在双击某个项目时,在jquery对话框中打开了CKEditor。当我关闭编辑器然后再次打开它们时,我的代码崩溃了。
解决方法是使用

CKEDITOR.instances.myInstanceName.destroy(false);

更新了 DOM 元素(文档链接)。


1
我们也在jquery对话框中打开了CKEditors。我们曾经使用CKEDITOR.instances.myInstanceName.destroy(true);,但这也导致我们的代码崩溃,出现错误“TypeError:a为null”。然而,将其切换为false并没有解决我们的问题。不得不在try / catch中包装这行代码。 - jgerman

6

使用以下简单代码。请注意我的文本区域ID是editor1
或者您也可以使用console.log(CKEDITOR.instances.editor1);进行检查。

if (CKEDITOR.instances.editor1) {
     CKEDITOR.instances.editor1.destroy();
}

6

for(name in CKEDITOR.instances){ CKEDITOR.instances[name].destroy() }

使用上述代码摧毁由ckeditor创建的所有实例。


-1

最终有效的解决方案。

问题是,如果你销毁了一个 ckeditor,然后尝试替换一个 textarea,那是行不通的。

我找到了这个简单的例子,给了我线索。使用 div 并附加 ckeditor,而不是使用 replace api 调用。

http://ckeditor.com/latest/samples/old/ajax.html

<div id='emailEditor1'>
              </div>

function closeTab() {
    emailEditor1.destroy();
    emailEditor1 = null;
}

function createEditor() 
    if (emailEditor1 == null) {
        emailEditor1 = CKEDITOR.appendTo( 'emailEditor1');
    }
}

-2
$this->widget('cms.extensions.fancybox.EFancyBox', array(
    'target' => 'a#fancy-link',
    'config' => array( 'onClosed'=>'js:function(){for(name in CKEDITOR.instances){ CKEDITOR.instances[name].destroy(true);}}'
)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接