我已经构建了一些自定义插件,但只有一个正在侦听键盘的关键事件。 在代码下面,您可以看到设置事件的设置。 (而且它有点基础)
现在我遇到以下问题:如果我在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函数有关的代码。
我不是要求解决方案。我想知道为什么会这样。
答案 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
上自动分离。