选择性地在CKEditor中触发更改事件

时间:2014-07-06 11:37:47

标签: ckeditor

我正在编写一个使用对话框的插件。

我注意到单击工具栏按钮打开对话框会在编辑器上触发change事件。无论如何在打开对话框时禁用此事件?

该插件使用setAttribute()removeAttribute()removeStyles()修改内容。无论如何都要调用这些方法来触发更改事件吗?


经过更多调查后,我发现了2个问题(我认为与使用YUI的应用框架有关),这可能是导致意外行为的原因。

要重现:http://jsfiddle.net/c3tqk/

问题1: 1.选择第一段(text)的一部分,然后单击Edit Link按钮。 2.选择第二段(link)的一部分,然后单击Edit Link按钮。检查控制台并注意触发了更改事件。

问题2: 1.在第一段中选择ex,然后单击Bold按钮。 2.取消选择并选择第一段中的x,然后单击Bold按钮。请注意,change事件被触发两次。

1 个答案:

答案 0 :(得分:6)

您始终可以手动触发事件,但通常不建议。使用CKEDITOR.event.fire

element.setAttribute( 'foo', 'bar' );
editor.fire( 'change' );

更好的想法是使用editor#saveSnapshot事件创建撤消快照(您的更改变得正式可撤销,非常酷)并在需要时自动触发editor#change

element.setAttribute( 'foo', 'bar' );
editor.fire( 'saveSnapshot' );

您也可以在触发时中断现有事件,并确保不会调用其他侦听器。只需使用低优先级的CKEDITOR.event.on侦听器。

editor.on( 'change', function( evt ) {
    if ( some condition ) {
        evt.stop();
        // ...or...
        evt.cancel();
    }
}, editor, null, -999 ); // by default listeners have priority=10

请参阅CKEDITOR.eventInfo.stopCKEDITOR.eventInfo.cancel。他们略有不同。

当你点击打开对话框(并创建正确的规则)时,为什么事件被触发可能会很棘手,但感觉很可能。我无法重现它(试过最新的Chrome和FF); change仅在键入或执行命令(如Bold,Link等)时被触发。如果您提供了一些有关您的设置的额外信息(版本的CKEditor和浏览器,编辑器配置对话框的名称),它会更容易调试。