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

Spo*_*ons 8 events ckeditor

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

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

我确实尝试用instanceReady事件替换contentDom,但这也没有解决它.

如果我手动设置数据: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)
                {
Run Code Online (Sandbox Code Playgroud)

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

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

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

Rei*_*mar 13

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() {
        ...
    } );
} );
Run Code Online (Sandbox Code Playgroud)

监听器将在下一次自动分离contentDomUnload.