在引擎中我们默认处理了很多事件,例如:文字输入、删除、复制、粘贴、左右方向键、markdown 语法输入监听、插件快捷键等等。这些事件在不同光标位置可能会有不同的处理逻辑,大多数操作都是修改 DOM 树结构、修复光标位置。另外,我们还把这些事件暴露给插件自行处理。
方法签名
/*** 绑定事件* @param eventType 事件类型* @param listener 事件回调* @param rewrite 是否重写*/on(eventType: string, listener: EventListener, rewrite?: boolean): void;/*** 移除绑定事件* @param eventType 事件类型* @param listener 事件回调*/off(eventType: string, listener: EventListener): void;/*** 触发事件* @param eventType 事件名称* @param args 触发参数*/trigger(eventType: string, ...args: any): any;
在 javascript 中我们通常使用 document.addEventListener document.removeEventListener 绑定 DOM 元素事件。在引擎中,我们抽象了一个 EventInterface
类型接口,并且 NodeInterface
类型的元素绑定了EventInterface
类型的属性 event。所以只要是 NodeInterface
类型的元素都可以通过 on off trigger,绑定、移除、触发事件。不仅可以绑定 DOM 原生事件,还可以绑定自定义事件
const node = $('<div></div>');//原生事件node.on('click', () => alert('click'));//自定义事件node.on('customer', () => alert('customer'));node.trigger('customer');
我们对特定的组合按键进行了处理,以下是我们暴露出来的一些事件,在编辑模式和阅读模式都有效
//引擎engine.on('事件名称', '处理方法');//阅读view.on('事件名称', '处理方法');
keydown:all
全选 ctrl+a 键按下,如果返回 false,终止处理其它监听
/*** @param event 按键事件* */(event: KeyboardEvent) => boolean | void
card:minimiz
卡片最小化时触发
/*** @param card 卡片实例* */(card: CardInterface) => void
card:maximize
卡片最大化时触发
/*** @param card 卡片实例* */(card: CardInterface) => void
parse:value-before
解析 DOM 节点,生成符合标准的编辑器值之前触发
/*** @param root DOM根节点*/(root: NodeInterface) => void
parse:value
解析 DOM 节点,生成符合标准的编辑器值,遍历子节点时触发。返回 false 跳过当前节点
/*** @param node 当前遍历的节点* @param attributes 当前节点已过滤后的属性* @param styles 当前节点已过滤后的样式* @param value 当前已经生成的编辑器值集合*/(node: NodeInterface,attributes: { [key: string]: string },styles: { [key: string]: string },value: Array<string>,) => boolean | void
parse:text
解析 DOM 节点,生成文本,遍历子节点时触发。返回 false 跳过当前节点
/*** @param node 当前遍历的节点* @param attributes 当前节点已过滤后的属性* @param styles 当前节点已过滤后的样式* @param value 当前已经生成的文本集合*/(node: NodeInterface,attributes: { [key: string]: string },styles: { [key: string]: string },value: Array<string>,) => boolean | void
parse:value-after
解析 DOM 节点,生成符合标准的编辑器值。生成 xml 代码结束后触发
/*** @param value xml代码*/(value: Array<string>) => void
parse:html-before
转换为 HTML 代码之前触发
/*** @param root 需要转换的根节点*/(root: NodeInterface) => void
parse:html
转换为 HTML 代码
/*** @param root 需要转换的根节点*/(root: NodeInterface) => void
parse:html-after
转换为 HTML 代码之后触发
/*** @param root 需要转换的根节点*/(root: NodeInterface) => void
copy
复制 DOM 节点时触发
/*** @param node 当前遍历的子节点*/(root: NodeInterface) => void
change
编辑器值改变事件
/*** @param value 编辑器值* */(value: string) => void
select
编辑器光标选中触发
() => void
focus
编辑器聚焦点时触发
() => void
blur
编辑器失去焦点时触发
() => void
beforeCommandExecute
在编辑器执行命令之前触发
/*** @param name 执行插件命令名称* @param args 命令执行参数* */(name: string, ...args: any) => void
afterCommandExecute
在编辑器执行命令之后触发
/*** @param name 执行插件命令名称* @param args 命令执行参数* */(name: string, ...args: any) => void
drop:files
拖动文件到编辑器时触发
/*** @param files 文件集合* */(files: Array<File>) => void
beforeSetValue
在给编辑器赋值前触发
/*** @param value 编辑器值* */(value: string) => void
afterSetValue
在给编辑器赋值后触发
/*** @param value 编辑器值* */(value: string) => void
readonly
编辑器只读属性变更后触发
/*** @param readonly 是否只读* */(readonly: boolean) => void
paste:event
当粘贴到编辑器事件发生时触发,如果返回 false,将不在处理粘贴
/*** @param data 粘贴板相关数据* @param source 粘贴的富文本* */(data: ClipboardData & { isPasteText: boolean }, source: string) => boolean | void
paste:schema
设置本次粘贴所需保留 DOM 元素的结构规则,以及属性所需保留的结构规则
/*** @param schema Schema对象,可以对结构规则增加修改删除等操作* */(schema: SchemaInterface) => void
paste:origin
解析粘贴数据,还未生成符合编辑器数据的片段之前触发
/*** @param root 粘贴的DOM节点* */(root: NodeInterface) => void
paste:each
解析粘贴数据,生成符合编辑器数据的片段之后循环整理子元素阶段触发
/*** @param node 粘贴片段遍历的元素子节点* */(root: NodeInterface) => void,
paste:each-after
解析粘贴数据,生成符合编辑器数据的片段之后循环整理子元素阶段后触发
/*** @param node 粘贴片段遍历的元素子节点* */(root: NodeInterface) => void
paste:before
由粘贴数据生成 DOM 片段后,还未写入到编辑器之前触发
/*** @param fragment 粘贴的片段* */(fragment: DocumentFragment) => void
paste:insert
插入当前粘贴的片段后触发,此时还未渲染卡片
/*** @param range 当前插入后的光标实例* */(range: RangeInterface) => void
paste:after
粘贴动作完成后触发
() => void
operations
DOM 改变触发,这些操作改变通常用于发送到协同服务端交互
/*** @param operations 操作项* */(operations: Operation[]) => void
keydown:enter
回车键按下,如果返回 false,终止处理其它监听
(event: KeyboardEvent) => boolean | void
keydown:backspace
删除键按下,如果返回 false,终止处理其它监听
(event: KeyboardEvent) => boolean | void
keydown:tab
Tab 键按下,如果返回 false,终止处理其它监听
(event: KeyboardEvent) => boolean | void
keydown:shift-tab
Shift-Tab 键按下,如果返回 false,终止处理其它监听
(event: KeyboardEvent) => boolean | void
keydown:at
@ 符合键按下,如果返回 false,终止处理其它监听
(event: KeyboardEvent) => boolean | void
keydown:space
空格键按下,如果返回 false,终止处理其它监听
(event: KeyboardEvent) => boolean | void
keydown:slash
反斜杠键按下,唤出 Toolbar,如果返回 false,终止处理其它监听
(event: KeyboardEvent) => boolean | void
keydown:left
左方向键按下,如果返回 false,终止处理其它监听
(event: KeyboardEvent) => boolean | void
keydown:right
右方向键按下,如果返回 false,终止处理其它监听
(event: KeyboardEvent) => boolean | void
keydown:up
上方向键按下,如果返回 false,终止处理其它监听
(event: KeyboardEvent) => boolean | void
keydown:down
下方向键按下,如果返回 false,终止处理其它监听
(event: KeyboardEvent) => boolean | void
keyup:enter
回车键按下弹起,如果返回 false,终止处理其它监听
(event: KeyboardEvent) => boolean | void
keyup:backspace
删除键按下弹起,如果返回 false,终止处理其它监听
(event: KeyboardEvent) => boolean | void
keyup:tab
Tab 键按下弹起,如果返回 false,终止处理其它监听
(event: KeyboardEvent) => boolean | void
keyup:space
空格键按下弹起,如果返回 false,终止处理其它监听
(event: KeyboardEvent) => boolean | void
render
在阅读器渲染完成后触发
/*** @param node 渲染根节点* */(node: NodeInterface) => void