/* 命令,封装 document.execCommand */ import $ from '../util/dom-core.js' import { UA } from '../util/util.js' // 构造函数 function Command(editor) { this.editor = editor } // 修改原型 Command.prototype = { constructor: Command, // 执行命令 do: function (name, value) { const editor = this.editor // 使用 styleWithCSS if (!editor._useStyleWithCSS) { document.execCommand('styleWithCSS', null, true) editor._useStyleWithCSS = true } // 如果无选区,忽略 if (!editor.selection.getRange()) { return } // 恢复选取 editor.selection.restoreSelection() // 执行 const _name = '_' + name if (this[_name]) { // 有自定义事件 this[_name](value) } else { // 默认 command this._execCommand(name, value) } // 修改菜单状态 editor.menus.changeActive() // 最后,恢复选取保证光标在原来的位置闪烁 editor.selection.saveRange() editor.selection.restoreSelection() // 触发 onchange editor.change && editor.change() }, // 自定义 insertHTML 事件 _insertHTML: function (html) { const editor = this.editor const range = editor.selection.getRange() if (this.queryCommandSupported('insertHTML')) { // W3C this._execCommand('insertHTML', html) } else if (range.insertNode) { // IE range.deleteContents() range.insertNode($(html)[0]) } else if (range.pasteHTML) { // IE <= 10 range.pasteHTML(html) } }, // 插入 elem _insertElem: function ($elem) { const editor = this.editor const range = editor.selection.getRange() if (range.insertNode) { range.deleteContents() range.insertNode($elem[0]) } }, // 封装 execCommand _execCommand: function (name, value) { document.execCommand(name, false, value) }, // 封装 document.queryCommandValue queryCommandValue: function (name) { return document.queryCommandValue(name) }, // 封装 document.queryCommandState queryCommandState: function (name) { return document.queryCommandState(name) }, // 封装 document.queryCommandSupported queryCommandSupported: function (name) { return document.queryCommandSupported(name) } } export default Command