事件

在引擎中我们默认处理了很多事件,例如:文字输入、删除、复制、粘贴、左右方向键、markdown 语法输入监听、插件快捷键等等。这些事件在不同光标位置可能会有不同的处理逻辑,大多数操作都是修改 DOM 树结构、修复光标位置。另外,我们还把这些事件暴露给插件自行处理。

方法签名

  1. /**
  2. * 绑定事件
  3. * @param eventType 事件类型
  4. * @param listener 事件回调
  5. * @param rewrite 是否重写
  6. */
  7. on(eventType: string, listener: EventListener, rewrite?: boolean): void;
  8. /**
  9. * 移除绑定事件
  10. * @param eventType 事件类型
  11. * @param listener 事件回调
  12. */
  13. off(eventType: string, listener: EventListener): void;
  14. /**
  15. * 触发事件
  16. * @param eventType 事件名称
  17. * @param args 触发参数
  18. */
  19. trigger(eventType: string, ...args: any): any;

元素事件

在 javascript 中我们通常使用 document.addEventListener document.removeEventListener 绑定 DOM 元素事件。在引擎中,我们抽象了一个 EventInterface 类型接口,并且 NodeInterface 类型的元素绑定了EventInterface类型的属性 event。所以只要是 NodeInterface 类型的元素都可以通过 on off trigger,绑定、移除、触发事件。不仅可以绑定 DOM 原生事件,还可以绑定自定义事件

  1. const node = $('<div></div>');
  2. //原生事件
  3. node.on('click', () => alert('click'));
  4. //自定义事件
  5. node.on('customer', () => alert('customer'));
  6. node.trigger('customer');

编辑器事件

我们对特定的组合按键进行了处理,以下是我们暴露出来的一些事件,在编辑模式和阅读模式都有效

  1. //引擎
  2. engine.on('事件名称', '处理方法');
  3. //阅读
  4. view.on('事件名称', '处理方法');

keydown:all

全选 ctrl+a 键按下,如果返回 false,终止处理其它监听

  1. /**
  2. * @param event 按键事件
  3. * */
  4. (event: KeyboardEvent) => boolean | void

card:minimiz

卡片最小化时触发

  1. /**
  2. * @param card 卡片实例
  3. * */
  4. (card: CardInterface) => void

card:maximize

卡片最大化时触发

  1. /**
  2. * @param card 卡片实例
  3. * */
  4. (card: CardInterface) => void

parse:value-before

解析 DOM 节点,生成符合标准的编辑器值之前触发

  1. /**
  2. * @param root DOM根节点
  3. */
  4. (root: NodeInterface) => void

parse:value

解析 DOM 节点,生成符合标准的编辑器值,遍历子节点时触发。返回 false 跳过当前节点

  1. /**
  2. * @param node 当前遍历的节点
  3. * @param attributes 当前节点已过滤后的属性
  4. * @param styles 当前节点已过滤后的样式
  5. * @param value 当前已经生成的编辑器值集合
  6. */
  7. (
  8. node: NodeInterface,
  9. attributes: { [key: string]: string },
  10. styles: { [key: string]: string },
  11. value: Array<string>,
  12. ) => boolean | void

parse:text

解析 DOM 节点,生成文本,遍历子节点时触发。返回 false 跳过当前节点

  1. /**
  2. * @param node 当前遍历的节点
  3. * @param attributes 当前节点已过滤后的属性
  4. * @param styles 当前节点已过滤后的样式
  5. * @param value 当前已经生成的文本集合
  6. */
  7. (
  8. node: NodeInterface,
  9. attributes: { [key: string]: string },
  10. styles: { [key: string]: string },
  11. value: Array<string>,
  12. ) => boolean | void

parse:value-after

解析 DOM 节点,生成符合标准的编辑器值。生成 xml 代码结束后触发

  1. /**
  2. * @param value xml代码
  3. */
  4. (value: Array<string>) => void

parse:html-before

转换为 HTML 代码之前触发

  1. /**
  2. * @param root 需要转换的根节点
  3. */
  4. (root: NodeInterface) => void

parse:html

转换为 HTML 代码

  1. /**
  2. * @param root 需要转换的根节点
  3. */
  4. (root: NodeInterface) => void

parse:html-after

转换为 HTML 代码之后触发

  1. /**
  2. * @param root 需要转换的根节点
  3. */
  4. (root: NodeInterface) => void

copy

复制 DOM 节点时触发

  1. /**
  2. * @param node 当前遍历的子节点
  3. */
  4. (root: NodeInterface) => void

引擎事件

change

编辑器值改变事件

  1. /**
  2. * @param value 编辑器值
  3. * */
  4. (value: string) => void

select

编辑器光标选中触发

  1. () => void

focus

编辑器聚焦点时触发

  1. () => void

blur

编辑器失去焦点时触发

  1. () => void

beforeCommandExecute

在编辑器执行命令之前触发

  1. /**
  2. * @param name 执行插件命令名称
  3. * @param args 命令执行参数
  4. * */
  5. (name: string, ...args: any) => void

afterCommandExecute

在编辑器执行命令之后触发

  1. /**
  2. * @param name 执行插件命令名称
  3. * @param args 命令执行参数
  4. * */
  5. (name: string, ...args: any) => void

drop:files

拖动文件到编辑器时触发

  1. /**
  2. * @param files 文件集合
  3. * */
  4. (files: Array<File>) => void

beforeSetValue

在给编辑器赋值前触发

  1. /**
  2. * @param value 编辑器值
  3. * */
  4. (value: string) => void

afterSetValue

在给编辑器赋值后触发

  1. /**
  2. * @param value 编辑器值
  3. * */
  4. (value: string) => void

readonly

编辑器只读属性变更后触发

  1. /**
  2. * @param readonly 是否只读
  3. * */
  4. (readonly: boolean) => void

paste:event

当粘贴到编辑器事件发生时触发,如果返回 false,将不在处理粘贴

  1. /**
  2. * @param data 粘贴板相关数据
  3. * @param source 粘贴的富文本
  4. * */
  5. (data: ClipboardData & { isPasteText: boolean }, source: string) => boolean | void

paste:schema

设置本次粘贴所需保留 DOM 元素的结构规则,以及属性所需保留的结构规则

  1. /**
  2. * @param schema Schema对象,可以对结构规则增加修改删除等操作
  3. * */
  4. (schema: SchemaInterface) => void

paste:origin

解析粘贴数据,还未生成符合编辑器数据的片段之前触发

  1. /**
  2. * @param root 粘贴的DOM节点
  3. * */
  4. (root: NodeInterface) => void

paste:each

解析粘贴数据,生成符合编辑器数据的片段之后循环整理子元素阶段触发

  1. /**
  2. * @param node 粘贴片段遍历的元素子节点
  3. * */
  4. (root: NodeInterface) => void,

paste:each-after

解析粘贴数据,生成符合编辑器数据的片段之后循环整理子元素阶段后触发

  1. /**
  2. * @param node 粘贴片段遍历的元素子节点
  3. * */
  4. (root: NodeInterface) => void

paste:before

由粘贴数据生成 DOM 片段后,还未写入到编辑器之前触发

  1. /**
  2. * @param fragment 粘贴的片段
  3. * */
  4. (fragment: DocumentFragment) => void

paste:insert

插入当前粘贴的片段后触发,此时还未渲染卡片

  1. /**
  2. * @param range 当前插入后的光标实例
  3. * */
  4. (range: RangeInterface) => void

paste:after

粘贴动作完成后触发

  1. () => void

ops

DOM 改变触发,这些操作改变通常用于发送到协同服务端交互

  1. /**
  2. * @param ops 操作项
  3. * */
  4. (ops: Op[]) => void

keydown:enter

回车键按下,如果返回 false,终止处理其它监听

  1. (event: KeyboardEvent) => boolean | void

keydown:backspace

删除键按下,如果返回 false,终止处理其它监听

  1. (event: KeyboardEvent) => boolean | void

keydown:tab

Tab 键按下,如果返回 false,终止处理其它监听

  1. (event: KeyboardEvent) => boolean | void

keydown:shift-tab

Shift-Tab 键按下,如果返回 false,终止处理其它监听

  1. (event: KeyboardEvent) => boolean | void

keydown:at

@ 符合键按下,如果返回 false,终止处理其它监听

  1. (event: KeyboardEvent) => boolean | void

keydown:space

空格键按下,如果返回 false,终止处理其它监听

  1. (event: KeyboardEvent) => boolean | void

keydown:slash

反斜杠键按下,唤出 Toolbar,如果返回 false,终止处理其它监听

  1. (event: KeyboardEvent) => boolean | void

keydown:left

左方向键按下,如果返回 false,终止处理其它监听

  1. (event: KeyboardEvent) => boolean | void

keydown:right

右方向键按下,如果返回 false,终止处理其它监听

  1. (event: KeyboardEvent) => boolean | void

keydown:up

上方向键按下,如果返回 false,终止处理其它监听

  1. (event: KeyboardEvent) => boolean | void

keydown:down

下方向键按下,如果返回 false,终止处理其它监听

  1. (event: KeyboardEvent) => boolean | void

keyup:enter

回车键按下弹起,如果返回 false,终止处理其它监听

  1. (event: KeyboardEvent) => boolean | void

keyup:backspace

删除键按下弹起,如果返回 false,终止处理其它监听

  1. (event: KeyboardEvent) => boolean | void

keyup:tab

Tab 键按下弹起,如果返回 false,终止处理其它监听

  1. (event: KeyboardEvent) => boolean | void

keyup:space

空格键按下弹起,如果返回 false,终止处理其它监听

  1. (event: KeyboardEvent) => boolean | void

阅读器事件

render

在阅读器渲染完成后触发

  1. /**
  2. * @param node 渲染根节点
  3. * */
  4. (node: NodeInterface) => void