Contribute to this guide

guide更新至 CKEditor 5 v27.x

更新 CKEditor 5 安装时,请确保所有包的版本一致,以避免错误。

对于自定义版本,您可能需要尝试删除package-lock.jsonyarn.lock 文件(如果适用),并在重建编辑器之前重新安装所有包。为了获得最佳效果,请确保您使用最新版本的包。

# 更新至 CKEditor 5 v27.1.0

发布于 2021 年 4 月 21 日。

有关版本 27.1.0 中引入的所有更改的完整列表,请参阅 CKEditor 5 v27.1.0 的发布说明

以下是升级到 CKEditor 5 v27.1.0 时需要您注意的最重要的更改。

# 禁止嵌套表格

在 27.1.0 版本之前,不允许将表格插入另一个表格。

如果您希望恢复此限制,请参阅表格功能指南的 禁止嵌套表格 部分。

# 禁止嵌套块引用

在 27.1.0 版本之前,不允许将块引用插入另一个块引用。

如果您希望恢复此限制,请参阅块引用功能指南的 禁止嵌套块引用 部分。

# 更新至 CKEditor 5 v27.0.0

发布于 2021 年 3 月 24 日。

有关版本 27.0.0 中引入的所有更改的完整列表,请参阅 CKEditor 5 v27.0.0 的发布说明

以下是升级到 CKEditor 5 v27.0.0 时需要您注意的最重要的更改。

# 剪贴板输入管道集成

从 v27.0.0 开始,Clipboard 插件不再触发 inputTransformation 事件。我们重构了此功能的代码,并将其拆分为

Clipboard 插件成为一个“粘合”插件,加载上面列出的插件。

从 v27.0.0 开始,ClipboardPipeline 插件负责触发 ClipboardPipeline#inputTransformation 事件,以及新的 ClipboardPipeline#contentInsertion 事件。

不应该在您的功能代码中触发或停止 view.Document#clipboardInputClipboardPipeline#inputTransformation 事件。应将 data.content 属性分配为覆盖默认内容。您只能在您想要完全禁用特定内容的粘贴/拖放时才停止此事件。

您可以在 剪贴板深入指南 中详细了解整个输入管道。

# view.Document 事件冒泡

CKEditor v27.0.0 引入了 view.Document 事件的冒泡,类似于 DOM 中的冒泡工作方式。这使我们能够重新排列以前依赖于 priority 属性的许多监听器。但是,这意味着使用优先级的现有监听器现在可能在错误的时间(以不同的顺序)执行。您应该根据监听器何时执行(在什么上下文/元素/阶段)来审查这些监听器。

事件系统指南 中阅读有关冒泡事件的更多信息。

# delete 事件

以前,不同的功能在不同的优先级级别上处理 delete 事件,例如,确保列表项优先于包含它的块引用。从 v27.0.0 开始,此优先级由事件在视图文档树上的冒泡来处理。现在,注册到视图元素中更深层的监听器会在更靠近 根元素 的元素的监听器之前触发。

查看核心编辑器功能中所有 delete 监听器的列表及其 优先级

功能 v27 之前的优先级 从 v27 开始的事件上下文
列表 高 + 10 li @ 正常
块引用 高 + 5 blockquote @ 正常
周围的部件类型 高 + 1 isWidget @ 正常
部件 $root @ 正常
删除 正常 $document @ 低

查看此表,即使您的监听器监听了 highest 优先级,它也会在最后一个监听了 $document 且优先级为 low 的处理程序之前触发,因为 $document注册监听器的默认上下文

以下是如何与块引用功能正确集成的示例更改

// Old code.
this.listenTo( view.document, 'delete', ( evt, data ) => {
    // ...
}, { priority: priorities.high + 5 } );

// New code.
this.listenTo( view.document, 'delete', ( evt, data ) => {
    // ...
}, { context: 'blockquote' } );

如果您将部分监听器附加到 delete 事件,我们建议您审查您的集成。

# enter 事件

enter 事件的情况与 delete 事件类似。

以下是如何与部件系统正确集成的示例更改

// Old code.
this.listenTo( view.document, 'enter', ( evt, data ) => {
    // ...
} );

// New code.
this.listenTo( view.document, 'enter', ( evt, data ) => {
    // This event could be triggered from inside the widget but we are interested
    // only when the widget itself is selected.
    if ( evt.eventPhase != 'atTarget' ) {
        return;
    }

    // ...

}, { context: isWidget } );

如果您将部分监听器附加到 enter 事件,我们建议您审查您的集成。

# arrowKey 事件

这是由 ArrowKeysObserver 引入的新事件类型。它在 normal 优先级上监听 keydown 事件,并触发在视图文档树上冒泡的 arrowKey 事件。这与 EnterObserverDeleteObserver 的行为类似。

如果您将部分监听器附加到 keydown 事件以处理箭头键按下,则应审查您的集成。