CKEDITOR.setData阻止使用.on函数附加事件

时间:2013-04-17 07:27:20

标签: events ckeditor

我已经构建了一些自定义插件,但只有一个正在侦听键盘的关键事件。 在代码下面,您可以看到设置事件的设置。 (而且它有点基础)

现在我遇到以下问题:如果我在instanceReady监听器中使用editor.setData设置我的数据,那么.on函数没有设置。

我确实尝试用instanceReady事件替换contentDom,但这也没有修复它。

如果用manualy设置数据:editor.document.getBody()。setHtml(html),没有问题。所有事件都没有任何问题。

CKEDITOR.plugins.add( 'myPlugin', {
    lang: '', // %REMOVE_LINE_CORE% 

    init: function( editor ) {

        //Bind events if the Dom is ready!
        editor.on( 'contentDom', function()
        {
                //keydown
                editor.document.on('keydown', function(e)
                {

有谁知道为什么会这样? setData函数是仅设置html还是重新加载编辑器或其他东西?

我确实看过这个Ckeditor Source 但我认为这不是与setData函数有关的代码。

我不是要求解决方案。我想知道为什么会这样。

1 个答案:

答案 0 :(得分:12)

每次设置新的内部文档时都会触发

Editor#contentDom。在框架式编辑器editor#setData()中,不仅会替换body.innerHTML,还会替换整个文档,因此每次都会触发contentDom

因此,您的代码会在每个setData()上添加新的侦听器,但您不会删除旧的侦听器。由于不明原因,这两名听众现在都没有被keydown解雇。我最近发现了这个,我无法解释这个事实。

无论如何,您需要在editor#contentDomUnload上分离所有侦听器。幸运的是,使用editable#attachListener可以方便地执行此操作。

editor.on( 'contentDom', function() {
    var editable = editor.editable();

    editable.attachListener( editor.document, 'keydown', function() {
        ...
    } );
} );

听众将在下一个contentDomUnload上自动分离。