wangeditor
Version:
wangEditor - 轻量级 web 富文本编辑器,配置方便,使用简单,开源免费
140 lines (119 loc) • 3.52 kB
text/typescript
/**
* @description 封装 document.execCommand
* @author wangfupeng
*/
import $, { DomElement } from '../utils/dom-core'
import Editor from './index'
class Command {
public editor: Editor
constructor(editor: Editor) {
this.editor = editor
}
/**
* 执行富文本操作的命令
* @param name name
* @param value value
*/
public do(name: string, value?: string | DomElement): void {
const editor = this.editor
if (editor.config.styleWithCSS) {
document.execCommand('styleWithCSS', false, 'true')
}
const selection = editor.selection
// 如果无选区,忽略
if (!selection.getRange()) {
return
}
// 恢复选取
selection.restoreSelection()
// 执行
switch (name) {
case 'insertHTML':
this.insertHTML(value as string)
break
case 'insertElem':
this.insertElem(value as DomElement)
break
default:
// 默认 command
this.execCommand(name, value as string)
break
}
// 修改菜单状态
editor.menus.changeActive()
// 最后,恢复选取保证光标在原来的位置闪烁
selection.saveRange()
selection.restoreSelection()
}
/**
* 插入 html
* @param html html 字符串
*/
private insertHTML(html: string): void {
const editor = this.editor
const range = editor.selection.getRange()
if (range == null) return
if (this.queryCommandSupported('insertHTML')) {
// W3C
this.execCommand('insertHTML', html)
} else if (range.insertNode) {
// IE
range.deleteContents()
if ($(html).elems.length > 0) {
range.insertNode($(html).elems[0])
} else {
let newNode = document.createElement('p')
newNode.appendChild(document.createTextNode(html))
range.insertNode(newNode)
}
editor.selection.collapseRange()
}
// else if (range.pasteHTML) {
// // IE <= 10
// range.pasteHTML(html)
// }
}
/**
* 插入 DOM 元素
* @param $elem DOM 元素
*/
private insertElem($elem: DomElement): void {
const editor = this.editor
const range = editor.selection.getRange()
if (range == null) return
if (range.insertNode) {
range.deleteContents()
range.insertNode($elem.elems[0])
}
}
/**
* 执行 document.execCommand
* @param name name
* @param value value
*/
private execCommand(name: string, value: string): void {
document.execCommand(name, false, value)
}
/**
* 执行 document.queryCommandValue
* @param name name
*/
public queryCommandValue(name: string): string {
return document.queryCommandValue(name)
}
/**
* 执行 document.queryCommandState
* @param name name
*/
public queryCommandState(name: string): boolean {
return document.queryCommandState(name)
}
/**
* 执行 document.queryCommandSupported
* @param name name
*/
public queryCommandSupported(name: string): boolean {
return document.queryCommandSupported(name)
}
}
export default Command