我正在编写一个使用对话框的插件。
我注意到单击工具栏按钮打开对话框会在编辑器上触发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事件被触发两次。
答案 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.stop
和CKEDITOR.eventInfo.cancel
。他们略有不同。
当你点击打开对话框(并创建正确的规则)时,为什么事件被触发可能会很棘手,但感觉很可能。我无法重现它(试过最新的Chrome和FF); change
仅在键入或执行命令(如Bold,Link等)时被触发。如果您提供了一些有关您的设置的额外信息(版本的CKEditor和浏览器,编辑器配置和对话框的名称),它会更容易调试。