注:本人只处理了选择单行的情况。
使用方法:1.先选择想要的样式所在的文字。2.点击启动格式刷。3.选中想要复制给的文字
前端菜鸡,烂代码勿喷QAQ
完整代码:
const { BtnMenu } = wangEditor;//配置格式刷class format extends BtnMenu {constructor(editors) {const $elem = wangEditor.$(`<div class="w-e-menu format-menu" data-title="格式刷"></div>`);super($elem, editors);}for_style(domE) {let arr = {};for (let i = 0; i < domE.length; i++) {arr[domE[i]] = domE[domE[i]];}//console.log("循环获取样式", arr);return arr;}font_style(domE) {let arr = [];let color = domE.getAttribute("color");let size = domE.getAttribute("size");let face = domE.getAttribute("face");if (color != null) {arr.push(`color='${color}'`);}if (size != null) {arr.push(`size='${size}'`);}if (face != null) {arr.push(`face='${face}'`);}return arr;}string_style(val) {let arr = "";for (const key in val) {if (val.hasOwnProperty(key)) {const element = val[key];arr += `${key}:${element};`;}}return arr;}clickHandler(e, type) {//console.log(this.$elem);//console.log("格式刷被点击");//获取editor全局编辑对象const editor = this.editor;// 判断当前格式刷是否已经被激活// 如果是激活状态:关闭格式刷if (this.formatShow) {this.formatShow = false;editor._brush = false;// editor._dblBrush = false;this.$elem.removeClass("format-active");editor.$textContainerElem.removeClass("brush");//console.log("关闭格式刷");return;}// 如果当前状态是未激活// 将格式刷改成激活状态this.formatShow = true;editor._brush = true;// this.$elem.addClass('w-e-active')// 如果是双击格式刷触发连续使用格式刷// 记录双击格式刷状态// editor._dblBrush = type === "dblclick" ? true : false;this.$elem.addClass("format-active");editor.$textContainerElem.addClass("brush");//获取选中对象let containerEle = editor.selection.getSelectionContainerElem();editor._html = [];if (containerEle.elems[0].tagName.toLowerCase() == "font") {//console.log("有font");editor._html.push({html: containerEle.elems[0].tagName.toLowerCase(),style: this.font_style(containerEle.elems[0]),});} else {editor._html.push({html: containerEle.elems[0].tagName.toLowerCase(),style: this.string_style(this.for_style(containerEle.elems[0].style)),});}//向上整合style//如果是顶级p标签name将style放在wrap里面,否则直接整合进stylewhile (!containerEle.equal(editor.$textElem)) {containerEle = containerEle.parent();//console.log("循环中", containerEle);if (containerEle.parent().equal(editor.$textElem) &&!containerEle.equal(editor.$textElem)) {editor._html.push({html: containerEle.elems[0].tagName.toLowerCase(),style: this.string_style(this.for_style(containerEle.elems[0].style)),});}if (!containerEle.parent().equal(editor.$textElem) &&!containerEle.equal(editor.$textElem)) {//console.log("非顶点");if (containerEle.elems[0].tagName.toLowerCase() == "font") {//console.log("有font");editor._html.push({html: containerEle.elems[0].tagName.toLowerCase(),style: this.font_style(containerEle.elems[0]),});} else {editor._html.push({html: containerEle.elems[0].tagName.toLowerCase(),style: this.string_style(this.for_style(containerEle.elems[0].style)),});}}}// editor._html = [];// editor._html.push(containerEle.elems[0].tagName.toLowerCase());//console.log(editor);editor.$textElem.on("mouseup", (e) => {// //console.log("监听可编辑区域", e);// //console.log("当前选区", editor.saveSelection());editor.$textElem.off("mouseleave", editor.selection.saveRange());if (editor._brush) {let text;let style = "";let wrapStyle = "";//console.log("选区是否为空", editor.selection.isSelectionEmpty());if (editor.selection.isSelectionEmpty()) {// 如果没有选中任何内容// 折叠选区editor.selection.collapseRange();} else {let range = editor.selection.getRange();let containerElem =editor.selection.getSelectionContainerElem();// 如果只刷了一行if (!containerElem.equal(editor.$textElem)) {text = editor.selection.getSelectionText();//设置模板let _html = "";for (let i = 0; i < editor._html.length; i++) {if (i == 0) {if (editor._html[0].html == "font") {let arr = ``;for (let index = 0;index < editor._html[0].style.length;index++) {arr += ` ${editor._html[0].style[index]}`;}console.log((_html = `<${editor._html[0].html} ${arr}>${text}</${editor._html[0].html}>`));_html = `<${editor._html[0].html} ${arr}>${text}</${editor._html[0].html}>`;} else {_html = `<${editor._html[0].html} style="${editor._html[0].style}">${text}</${editor._html[0].html}>`;}} else {if (editor._html[i].html == "font") {let arr = ``;for (let index = 0;index < editor._html[i].style.length;index++) {arr += ` ${editor._html[i].style[index]}`;}_html = `<${editor._html[i].html} ${arr}>${_html}</${editor._html[i].html}>`;} else {_html = `<${editor._html[i].html} style="${editor._html[i].style}">${_html}</${editor._html[i].html}>`;}}}//渲染模板editor.cmd.do("insertHTML", _html);}}}});}// 菜单激活状态tryChangeActive() { }}editor.menus.extend("format", format);