在CKEditor中有选择地激发更改事件

在CKEditor中有选择地激发更改事件,ckeditor,Ckeditor,我正在编写一个使用对话框的插件 我注意到,单击工具栏按钮打开对话框会在编辑器上触发change事件。在打开对话框时,是否仍要禁用此事件 该插件使用setAttribute()、removeAttribute()和removeStyles()修改内容。对这些方法的调用是否会触发更改事件 经过进一步调查,我发现了两个问题(我认为与使用YUI的应用程序框架有关),这可能是导致意外行为的原因 复制: 问题1: 1.选择第一段的一部分(文本),然后单击编辑链接按钮。 2.选择第二段的一部分(链接),然后

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

我注意到,单击工具栏按钮打开对话框会在编辑器上触发
change
事件。在打开对话框时,是否仍要禁用此事件

该插件使用
setAttribute()
removeAttribute()
removeStyles()
修改内容。对这些方法的调用是否会触发更改事件


经过进一步调查,我发现了两个问题(我认为与使用YUI的应用程序框架有关),这可能是导致意外行为的原因

复制:

问题1: 1.选择第一段的一部分(
文本
),然后单击
编辑链接
按钮。 2.选择第二段的一部分(
链接
),然后单击
编辑链接
按钮。检查控制台,注意触发了一个更改事件

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

您始终可以手动触发事件,尽管通常不建议这样做。使用:

更好的方法是使用事件,它创建撤消快照(您的更改可以正式撤消,这很酷),并在需要时自动触发:

element.setAttribute( 'foo', 'bar' );
editor.fire( 'saveSnapshot' );
您还可以在现有事件被触发时中断它们,并确保没有调用其他侦听器。只需使用低优先级的侦听器

editor.on( 'change', function( evt ) {
    if ( some condition ) {
        evt.stop();
        // ...or...
        evt.cancel();
    }
}, editor, null, -999 ); // by default listeners have priority=10
见和。他们略有不同


当您单击打开对话框(并创建正确的规则)时,可能很难理解触发事件的原因,但这是完全可能的。但我无法复制它(尝试了最新的Chrome和FF)<代码>更改仅在键入或执行命令(如粗体、链接等)时触发。如果您提供了一些关于设置的额外信息(版本的CKEditor和浏览器、编辑器配置、对话框名),那么调试就容易多了。

我还没有检查您的jsfiddle,但我从其他问题中记得,YUI向元素添加了一些id。这太荒谬了,这会破坏撤销管理器。嗯@F21已删除她/他的评论。
editor.on( 'change', function( evt ) {
    if ( some condition ) {
        evt.stop();
        // ...or...
        evt.cancel();
    }
}, editor, null, -999 ); // by default listeners have priority=10