【问题标题】:disable CKEditor indentation plugin禁用 CKEditor 缩进插件
【发布时间】:2014-01-10 21:21:16
【问题描述】:

我需要在 CKEditor(4.2 或 4.3)中完全禁用有序和无序列表(<ul><ol>)的缩进,因为我需要将(非常有限的)HTML 转换为另一种标记语言不支持缩进。

我尝试了几种方法,但都没有运气:

尝试 1:通过配置删除插件

config.removePlugins = 'indent,indentlist,indentblock';

我猜这不起作用,因为这些插件似乎是必需的 - 从网站构建 CKEditor 包时无法删除它们。

通过 FireBug 控制台查看 CKEDITOR.plugins 时,这些插件仍然存在。甚至不存在自己的插件文件夹 - 似乎它们是内置在核心中的。

尝试 2:覆盖 TAB 键

我创建了一个新插件disableTab,它完全不做任何事情(除了return true; 在执行时)。

插件注册为 TAB 键击键的处理程序:

config.keystrokes = [
     [ 9, 'disableTab' ] // disable TAB key to avoid nesting!
];

不幸的是,当在列表的第一级(<li><ol>)上按 Tab 时,插件不起作用。有趣的是,当在列表的第二级 (ol > li > ol > li) 中按 TAB 时它可以工作,它不会在第二级以下生成更多的嵌套列表。我确定我的插件已执行,因为我在我的插件中插入了一个alert() 进行测试。至少,在我的 Firefox 中是这样的。

但我需要完全禁用缩进,不仅仅是高于 2 级。

尝试 3:在编辑器配置中通过 blockedKeystrokes 阻止击键:

不起作用,即使它应该根据文档:

config.blockedKeystrokes = [ 9 ];

尝试 4:在运行时移除击键

根据 API 文档,此代码应该禁用击键,但由于某种原因它不起作用:

for (instance in CKEDITOR.instances) {
    var editor = CKEDITOR.instances[instance];
    editor.setKeystroke(9, false);
}

知道如何在 CKEditor 中删除列表的缩进吗?

我不明白为什么这些方法都不起作用。如果您知道原因,请告诉我。

更新:

有趣的是,除了按 TAB 键之外,这段代码几乎在每个按键事件中都会向我打招呼:

editor.on('key', function(e) { alert ("hi"); return false; });

看来我的设置(LinuxMint 13 [Gnome 2] + Firefox 18 + CKEditor 4.2)没有触发 TAB 键的键事件处理程序。也许缩进插件使用其他事件?模糊?

更新 2:

这是一个 Firefox(可能仅限 linux)问题。有几种方法适用于 Chrome 或 Internet Explorer。

【问题讨论】:

  • 看看这是否有效:editorInstace.on("key", function (e) { return e.data.keyCode !=== 9; });

标签: javascript ckeditor


【解决方案1】:

我刚刚快速检查了一下,看起来虽然 indentlistlist 插件所必需的,但如果您:

0) 从http://github.com/ckeditor/ckeditor-dev下载CKEditor源代码

1) 删除

requires: 'indentlist',

来自plugins/list/plugin.js

2) 删除

indentlist: 1,  
indentblock: 1,

来自dev/builder/build-config.js

3) 使用dev/builder/build.sh 构建发布包(在 Windows 上使用“Git Bash”外壳)

您将在dev/builder/release/ckeditor 文件夹中找到您需要的发行版本。

(一个必需的插件并不是真正需要的,这种情况并不常见,但列表不需要缩进的情况也很罕见;-))

【讨论】:

  • 非常感谢您提供这个小方法!在项目的后期(下一个主要版本),我们可能会制作 CKeditor 的缩小定制版本。现在我会坚持禁用 TAB 键 ;-)
【解决方案2】:

尝试将您的代码更改为:

editor = CKEDITOR.replace( 'element_name' );

editor.on('key', function(e) {
var key = e.data.keyCode;      
if(key==9) {
return false;
}

应该可以,只需将 'element_name' 更改为您要替换为 ckeditor 的文本区域

【讨论】:

  • 不起作用。有趣的是,editor.on('key', function(e) { alert("hi"); return false; } 向我打招呼,除了 TAB 之外的几乎所有键!似乎 TAB 键不会在我的 Linux+Firefox+CKEditor 设置中触发 on("key") 事件!那么,我该如何改变呢? ;)
  • 上面的代码成功禁用了我在ckeditor中的tab按钮,但是我使用的是Windows+Chrome+CKEditor 4.3.1设置。
  • 已确认。适用于 Chromium (Linux) 和 IE (Windows)。是 Firefox 相关的问题。
【解决方案3】:

内置的 indentlist 插件会在处理事件时取消冒泡,因此不会触发 tab 键的标准事件侦听器。如果您优先安排您的事件首先运行,您可以捕获 tab 键事件并阻止它缩进您的列表。

例如:

editor.on('key', function (evt) {
    if (editor.mode != 'wysiwyg') {
        return false;
    }

    if (evt.data.keyCode == this.indentKey || evt.data.keyCode == 9) {
        evt.cancel();
        return false;
    }
}, null, null, 1);

如果您只想阻止编号列表上的缩进,您可以添加以下条件:

editor.on('key', function (evt) {
    var path = editor.elementPath();

    if (editor.mode != 'wysiwyg') {
        return false;
    }

    if (evt.data.keyCode == this.indentKey || evt.data.keyCode == 9 && path.contains('ol')) {
        evt.cancel();
        return false;
    }
}, null, null, 1);

这里的文档中概述了事件优先级:https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_event.html#method-on

【讨论】:

  • 尽管这是一个老问题,但代码在生产应用程序中仍然有效。谢谢,这有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 2015-10-29
  • 1970-01-01
相关资源
最近更新 更多