Javascript 显示但禁用所见即所得按钮

Javascript 显示但禁用所见即所得按钮,javascript,ckeditor,Javascript,Ckeditor,我在一个环境中运行CKEditor,在这个环境中,权限决定了您的内容编辑级别。一个要求是按钮要为每个人显示,但某些按钮的点击事件被禁用 我尝试过许多jQuery解决方案(attr、off、preventDefault、prop等),但都不起作用,至少我是如何尝试的 CKFinder生成的示例HTML,“添加图像”按钮: <a id="cke_22" class="cke_button cke_button__image cke_button_off " "="" hre

我在一个环境中运行CKEditor,在这个环境中,权限决定了您的内容编辑级别。一个要求是按钮要为每个人显示,但某些按钮的点击事件被禁用

我尝试过许多jQuery解决方案(attr、off、preventDefault、prop等),但都不起作用,至少我是如何尝试的

CKFinder生成的示例HTML,“添加图像”按钮:

<a id="cke_22" 
    class="cke_button cke_button__image cke_button_off " "="" 
    href="javascript:void('Image')" title="Image" tabindex="-1" hidefocus="true" role="button" aria-labelledby="cke_22_label" aria-haspopup="false" 
    onkeydown="return CKEDITOR.tools.callFunction(56,event);" 
    onfocus="return CKEDITOR.tools.callFunction(57,event);" 
    onmousedown="return CKEDITOR.tools.callFunction(58,event);" 
    onclick="CKEDITOR.tools.callFunction(59,this);return false;">

    <span class="cke_button_icon cke_button__image_icon">&nbsp;</span>
    <span id="cke_22_label" class="cke_button_label cke_button__image_label">Image</span>
</a>


我在他们的文档中找不到CKEditor解决方案,但我可能遗漏了一些内容。如果一些额外的Javascript可以破坏链接,我愿意在CKEditor之外进行修复。

如果您觉得足够的话,以图像为例,您可以简单地取消所有处理程序。我不知道CKE是否真的定期恢复它们,但如果不是,您可以这样做

jQuery('.cke_button__image')
    .attr('onkeydown','')
    .attr('onmousedown','')
    .attr('onclick','');

它在CKEditor演示中工作。如果属性重新出现,只需重复该过程。请注意,这不是一个真正的安全答案。任何半途而废的黑客都会很容易绕过这些限制,但它会满足您的需求。

您需要使用CKEditor API来正确地做到这一点。通过jQuery禁用按钮是一个坏主意,因为这样不会阻止键盘快捷键、上下文菜单位置,还会破坏a11y功能(例如,使用键盘导航工具栏将被破坏)

要禁用例如链接图像功能,请使用以下代码:

CKEDITOR.replace( 'editor1', {
    on: {
        loaded: function( evt ) {
            var editor = evt.editor;

            editor.getCommand( 'image' ).on( 'state', function() {
                this.disable();
            } );
            editor.getCommand( 'link' ).on( 'state', function() {
                this.disable();
            } );
        }
    }
} );
它确保每个状态更改命令都被禁用


提示:如果您不确定要禁用的命令的名称,请检查
编辑器。commands
对象,这可能会给您一些想法。

这是一个更好的解决方案。这是有道理的,但我的日子不好过。CKEDITOR返回数据,但editor.commands显示为空。getCommand文档没有太大帮助。如果我没有做一些明显愚蠢的事情,我可以发布一个新问题。
编辑器
不是一个全局变量。您需要从
CKEDITOR.instances
object获取它,或者像我在回答中所做的那样,从一个事件侦听器中的
evt.editor
获取它。解决了这个问题!看起来CK4和CK3有点不同。我使用了
ev.editor.commands.justifyleft.disable()其中justifyleft来自命令列表。我有一个后续问题,但我会标记这接受,因为它让我在那里!