8

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

现在我有以下问题,如果我在 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)
                {

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

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

我不是在寻求解决方案。我想了解为什么会这样。

4

1 回答 1

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() {
        ...
    } );
} );

监听器将在 next 上自动分离contentDomUnload

于 2013-04-17T11:30:55.253 回答