Ckeditor 是否仅使用有效的文本选择启用编辑器工具栏按钮?

Ckeditor 是否仅使用有效的文本选择启用编辑器工具栏按钮?,ckeditor,Ckeditor,我正在开发一个用于注释文本和添加边距注释的CKEditor插件,但是我希望只有当用户已经选择了一系列文本时,才能启用一些自定义工具栏按钮。无论用户何时键入,或光标位于单个点(而不是某个范围),都应禁用按钮(及其相关命令) 我是一位经验丰富的插件作者,我花了相当多的时间搜索插件,但我还没有找到任何看起来有用的东西。您的案例有点棘手,因为选择更改事件在浏览器中没有很好地实现,FF是主要问题 在您的情况下,您将需要经常检查选择更改,因为您对所有选择更改都感兴趣,所以CKEditor将不适合它 幸运的是

我正在开发一个用于注释文本和添加边距注释的CKEditor插件,但是我希望只有当用户已经选择了一系列文本时,才能启用一些自定义工具栏按钮。无论用户何时键入,或光标位于单个点(而不是某个范围),都应禁用按钮(及其相关命令)


我是一位经验丰富的插件作者,我花了相当多的时间搜索插件,但我还没有找到任何看起来有用的东西。

您的案例有点棘手,因为选择更改事件在浏览器中没有很好地实现,FF是主要问题

在您的情况下,您将需要经常检查选择更改,因为您对所有选择更改都感兴趣,所以CKEditor将不适合它

幸运的是,编辑器中有一个
selectionCheck
事件,它触发的频率更高,并且是为FF实现的

解决方案:

这里有一个插件的
init
方法,我模仿它来解决您的问题。它将按照您解释的方式禁用/启用按钮

我已经在这个功能中添加了节流功能,这样机器扩展性较低的客户可以欣赏您的功能:)


如果你正在开发一个插件,我猜你是在向ckeditor注册s

在这种情况下,您应该提供一个方法,该方法将在需要时由CKEditor调用以更新按钮的状态:

由命令定义定义,用于确定命令的函数 国家。当编辑器具有其状态或选择时,将调用它 变了

您可以在CKEditor团队开发的几个插件中看到实现示例。这里有一个来自:


以下是使用Gyum Fox建议的方法准确回答问题所需的代码。
我提到要使其工作,
contextSensitive
必须设置为1

editor.addCommand( 'myCommand', {
    exec: function( editor ) {
        // Custom logic of the command
    },
    refresh: function( editor ) {
        var editable = editor.editable();
        range = editable.getDocument().getSelection().getRanges()[ 0 ]; // We assume only one range.
        commandState = ( range && !range.collapsed ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED;
        this.setState( commandState );
    },
    contextSensitive: 1
});

编辑:我注意到我这边有一些刷新问题。因此,正因为如此,我选择了马雷克·莱万多夫斯基的答案。

很有魅力。非常感谢你的帮助!而且,更一般地说,非常感谢您在CKEditor上的工作,这是一款我每天都依赖的优秀软件:)好吧,先生,谢谢您的客气话!在每个版本中,我们都试图使CKEditor更丰富、更强大:)
refresh: function( editor, path ) {

    var element = path.lastElement && path.lastElement.getAscendant( 'a', true );

    if ( element && element.getName() == 'a' && element.getAttribute( 'href' ) && element.getChildCount() )
        this.setState( CKEDITOR.TRISTATE_OFF );
    else
        this.setState( CKEDITOR.TRISTATE_DISABLED );
}
editor.addCommand( 'myCommand', {
    exec: function( editor ) {
        // Custom logic of the command
    },
    refresh: function( editor ) {
        var editable = editor.editable();
        range = editable.getDocument().getSelection().getRanges()[ 0 ]; // We assume only one range.
        commandState = ( range && !range.collapsed ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED;
        this.setState( commandState );
    },
    contextSensitive: 1
});