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

现在我有以下问题,如果我在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函数有关的代码。

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

最佳答案

每次设置新的内部文档时都会触发 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上自动分离。

关于events - CKEDITOR.setData防止使用.on函数附加事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16054070/

10-12 16:48