编辑器 API

config 相关

getConfig

获取编辑器所有配置

  1. editor.getConfig()

getMenuConfig

获取单个 menu 的配置。menu 配置相关的可参考这里

  1. editor.getMenuConfig(menuKey)

getAllMenuKeys

获取编辑器所有 menu 的 key

  1. editor.getAllMenuKeys()

alert

编辑器 alert ,可通过 customAlert 配置。

  1. editor.alert('错误信息', 'error')

内容处理

handleTab

控制编辑器按 tab 键时,输入什么。默认如下

  1. editor.handleTab = () => editor.insertText(' ')

getHtml

editor.getHtml() 获取非格式化的 html

  1. <p>head</p><p>hello <strong>word</strong></p>

你可以自行格式化 html ,如使用 xml-formatter编辑器 API - 图1open in new window

getText

获取当前编辑器的纯文本内容

  1. const text = editor.getText()

isEmpty

判断当前编辑器内容是否为空(只有一个空段落)

  1. editor.isEmpty()

TIP

该方法只能识别只有一个空段落情况,其他情况(如有一个空标题、空表格)请使用 editor.getText() 来判断。

getSelectionText

获取选中的文本

  1. editor.getSelectionText()

getElemsByType

通过 type 获取编辑器的 element 列表。

  1. editor.getElemsByType('image') // 所有图片
  2. editor.getElemsByType('link') // 所有链接
  3. // 其他

getElemsByTypePrefix

通过 type 前缀获取编辑器的 element 列表。

  1. editor.getElemsByTypePrefix('header') // 获取所有标题 header1 header2 header3...
  2. // 其他

deleteBackward

向后删除,相当于按 backspace 键。

  1. editor.deleteBackward()

deleteForward

向后删除,相当于按 delete 键(部分键盘没有这个键)

  1. editor.deleteForward()

deleteFragment

删除选中的内容

  1. editor.deleteFragment()

getFragment

获取选中的内容,json 格式

  1. editor.getFragment()

insertBreak

在选区回车换行

  1. editor.insertBreak()

insertText

在选区插入文本

  1. editor.insertText('xxx')

dangerouslyInsertHtml

  • 如果是 editor.getHtml() 获取的 HTML 格式,可以完美解析。
  • 如果是其他的 HTML 格式,则不能保证语义正确 —— dangerously
  1. editor.dangerouslyInsertHtml(`<h1>标题</h1><p>文本 <b>加粗</b></p>`)

clear

清空编辑器内容

  1. editor.clear()

重置内容

可以通过 selection API 和 node API 来重置内容

  1. import { SlateTransforms } from '@wangeditor/editor'
  2. // 全选并删除
  3. editor.select([])
  4. editor.deleteFragment()
  5. // 1. 插入 HTML 格式
  6. // 1.1 第一行改为 paragraph
  7. SlateTransforms.setNodes(editor, { type: 'paragraph' }, { mode: 'highest' })
  8. // 1.2 插入内容
  9. editor.dangerouslyInsertHtml('<p>你的文章内容</p>')
  10. // // 2. 插入 JSON 内容
  11. // // 2.1 插入 node
  12. // SlateTransforms.insertNodes(editor, [
  13. // { type: 'paragraph', children: [{ text: '你的文章内容1' }] },
  14. // { type: 'paragraph', children: [{ text: '你的文章内容2' }] }
  15. // ])
  16. // // 2.2 删除第一个空行(按需)
  17. // SlateTransforms.removeNodes(editor, { at: [0] })

undo

撤销

  1. editor.undo()

redo

重做

  1. editor.redo()

节点操作

使用节点操作 API 前,请查看 节点数据结构

insertNode

在选区插入一个节点

  1. const node = { type: 'paragraph', children: [{ text: 'simple text' }] }
  2. editor.insertNode(node)

insertNodes

在选区插入多个节点

  1. import { SlateTransforms } from '@wangeditor/editor'
  2. const node1 = { type: 'paragraph', children: [{ text: 'aaa' }] }
  3. const node2 = { type: 'paragraph', children: [{ text: 'bbb' }] }
  4. const nodeList = [node1, node2]
  5. SlateTransforms.insertNodes(editor, nodeList)

removeNodes

删除选区所在的节点

  1. import { SlateTransforms } from '@wangeditor/editor'
  2. SlateTransforms.removeNodes(editor)

获取选中节点

可使用 SlateEditor.nodes 获取选中的节点。详情可参考 Slate.js编辑器 API - 图2open in new window 中的 Editor.nodes API 。

  1. import { SlateEditor, SlateElement, SlateNode } from '@wangeditor/editor'
  2. const nodeEntries = SlateEditor.nodes(editor, {
  3. match: (node: SlateNode) => {
  4. if (SlateElement.isElement(node)) {
  5. if (node.type === 'paragraph') {
  6. return true // 匹配 paragraph
  7. }
  8. }
  9. return false
  10. },
  11. universal: true,
  12. })
  13. if (nodeEntries == null) {
  14. console.log('当前未选中的 paragraph')
  15. } else {
  16. for (let nodeEntry of nodeEntries) {
  17. const [node, path] = nodeEntry
  18. console.log('选中了 paragraph 节点', node)
  19. console.log('节点 path 是', path)
  20. }
  21. }

setNodes

设置选中节点的属性

  1. import { SlateTransforms } from '@wangeditor/editor'
  2. SlateTransforms.setNodes(editor, {
  3. // @ts-ignore
  4. textAlign: 'right'
  5. }, {
  6. mode: 'highest' // 针对最高层级的节点
  7. })

getParentNode

获取一个节点的父节点

  1. const parentNode = editor.getParentNode(node) // 返回 node 或者 null

toDOMNode

获取一个节点对应的 DOM 节点

  1. const elem = editor.toDOMNode(node) // 返回 HTMLElement

isInline

判断一个节点是否是 inline

  1. const inline = editor.isInline(node)

isVoid

判断一个节点是否是 void

  1. const void = editor.isVoid(node)

TIP

void node 即没有子元素的节点(它本身就可以看作是一个特殊字符),例如 image video 。可参考 html void element编辑器 API - 图3open in new window 定义。

你可以通过 editor.isVoid 自定义哪些元素是 void ,但需要详细学习 slate 。

isText

判断一个节点是否是 text

  1. import { SlateText } from '@wangeditor/editor'
  2. SlateText.isText(node) // true/false

isElement

判断一个节点是否是 elem

  1. import { SlateElement } from '@wangeditor/editor'
  2. SlateElement.isElement(node) // true/false

addMark

为选中的文本添加标记(文本样式)

  1. editor.addMark('bold', true) // 加粗
  2. editor.addMark('color', '#999') // 文本颜色

removeMark

对选中的文字,取消标记(文本样式)

  1. editor.removeMark('bold') // 取消加粗

marks

获取选中文字的标记(文本样式)

  1. import { SlateEditor } from '@wangeditor/editor'
  2. SlateEditor.marks(editor) // 例如 { bold: true, color: "#595959" }

DOM 相关

id 属性

获取编辑器 id

  1. editor.id // 如 'wangEditor-1'

isFullScreen 属性

编辑器是否全屏

  1. editor.isFullScreen // true/false

focus

聚焦到编辑器

  1. editor.focus()

blur

失焦编辑器

  1. editor.blur()

isFocused

判断当前编辑器是否聚焦?

  1. editor.isFocused() // true/false

updateView

强制更新视图

  1. editor.updateView()

TIP

updateView 是内部 API ,不建议用户使用。如要使用,也请勿频繁执行。

scrollToElem

滚动到指定元素,类似锚点。如滚动到某个标题的位置。

可根据 toDOMNode 获取 node 对应的 DOM 元素。

  1. editor.scrollToElem(elemId)

showProgressBar

显示进度条,一般用于上传功能

  1. editor.showProgressBar(progress) // progress 为 0-100 的数字

hidePanelOrModal

隐藏当前的弹框 (如插入链接) 和下拉列表(如设置标题、设置字体)

  1. editor.hidePanelOrModal()

fullScreen

设置为全屏

  1. editor.fullScreen()

TIP

全屏功能,有 html 结构的要求,请参考这里

unFullScreen

取消全屏

  1. editor.unFullScreen()

disable

禁用编辑器,设置为只读

  1. editor.disable()

isDisabled

判断当前编辑器是否只读?

  1. editor.isDisabled() // true/false

enable

取消禁用,取消只读

  1. editor.enable()

destroy

销毁编辑器和工具栏

  1. editor.destroy()

TIP

destroy 仅仅是移除编辑器、工具栏的 DOM 节点,全局绑定的事件等。
自己定义的变量,如 const editor = createEditor({...}) ,这个 editor 还需要自己来销毁。

获取编辑区域容器 DOM

获取编辑区域容器 DOM 节点

  1. editor.getEditableContainer()

selection 相关

selection 数据结构参考 slate Location编辑器 API - 图4open in new window

selection 属性

获取编辑器当前的选区。如果未选中,则返回 null

  1. editor.selection // selection 或 null

selection 数据结构如下:

  1. {
  2. "anchor": { "path": [1,0], "offset":8 },
  3. "focus": { "path": [1,0], "offset":10 }
  4. }

select

选中一个指定的选区。

  1. const newSelection = {
  2. anchor: { path: [1,0], offset:8 },
  3. focus: { path: [1,0], offset:10 }
  4. }
  5. editor.select(newSelection)

selectAll

选中所有内容

  1. editor.selectAll()

deselect

取消选中

  1. editor.deselect()

move

移动光标

  1. editor.move(3) // 移动 3 个字符

moveReverse

反向移动光标

  1. editor.moveReverse(2) // 反向移动 2 个字符

restoreSelection

恢复最近一次非 null 选区。如编辑器 blur 之后,再重新恢复选区。

  1. editor.restoreSelection()

isSelectedAll

判断编辑器是否全部选中。

  1. editor.isSelectedAll() // true/false

getSelectionPosition

获取选区的定位,将视情况返回 left right top bottom 的其中几个

  1. editor.getSelectionPosition() // 例如 { left: "80.15px", top: "116px" }

【注意】该定位是相对于编辑区域的,而非 body 。
你可以获取编辑区域 DOM 元素的定位 editor.getEditableContainer().getBoundingClientRect() 从而计算出相对于 body 的定位。

getNodePosition

获取某个节点的定位,将视情况返回 left right top bottom 的其中几个

  1. editor.getNodePosition(node) // 例如 { left: "80.15px", top: "116px" }

【注意】该定位是相对于编辑区域的,而非 body。
你可以获取编辑区域 DOM 元素的定位 editor.getEditableContainer().getBoundingClientRect() 从而计算出相对于 body 的定位。

自定义事件

wangEditor 使用 event-emitter编辑器 API - 图5open in new window 来做自定义事件。

on

监听某个事件

  1. editor.on('event-key', fn)

off

取消监听

  1. editor.off('event-key', fn)

once

只监听一次

  1. editor.once('event-key', fn)

emit

触发事件

  1. editor.emit('event-key')

内置的事件

  1. editor.on('fullScreen', () => { console.log('fullScreen') })
  2. editor.on('unFullScreen', () => { console.log('unFullScreen') })
  3. editor.on('scroll', () => { console.log('scroll') })
  4. editor.on('modalOrPanelShow', modalOrPanel => { console.log(modalOrPanel) })
  5. editor.on('modalOrPanelHide', () => { console.log('modalOrPanelHide') })

使用 slate 解锁更多 API

wangEditor 基于 slate.js编辑器 API - 图6open in new window(但不依赖 React)开发

上文已列出了比较常用的 API ,但这并不是全部。 slate.js 还提供了更多 API ,可满足你的所有操作需求。

Transforms API

参考 slate Transforms API编辑器 API - 图7open in new window

使用如下方式即可得到 slate Transforms 对象,不用再单独安装 slate 。

  1. import { SlateTransforms } from '@wangeditor/editor'

Node Editor API

参考 slate Node API编辑器 API - 图8open in new window

使用如下方式即可得到 slate Node 相关对象,不用再单独安装 slate 。

  1. import { SlateEditor, SlateNode, SlateElement, SlateText } from '@wangeditor/editor'

Location API

参考 slate Location API编辑器 API - 图9open in new window

使用如下方式即可得到 slate Location 相关对象,不用再单独安装 slate 。

  1. import { SlateLocation, SlatePath, SlatePoint, SlateRange } from '@wangeditor/editor'