美文网首页
基于wangeditor的格式刷

基于wangeditor的格式刷

作者: Elliott_077d | 来源:发表于2021-03-08 20:30 被阅读0次

工作中需要使用富文本,出于简洁的考虑,我选择了wangeditor,可是PM突然说要加一个格式刷功能,所以去找插件,然后我就看到了下面这张图。

image

同时也在其他地方看到了类似的文章,不过他使用的editor版本貌似和我的不一致,所以决定自己写一个。

首先要判断格式刷的边界问题,range获取到的节点是当前选中区域所在节点的父节点,而不是你选择的文字部分。所以,实际上需要复制的样式是获取到的节点一层一层往里找,直到找到文本节点为止,如果该节点没有,就找它的第一个子节点

 function getTargetDom(dom) {
    for (let i of dom.childNodes) {
      if (i.nodeType === 3 && i.nodeValue && i.nodeValue.trim() !== '') {
        targetDom = dom;
        return;
      }
    }
    getTargetDom(dom.children[0]);
  }

然后我们要从这个目标节点开始一层一层往上找,直到找到p标签为止,因为p标签在富文本里面代表一行,同时,因为模板没有严格按照编辑器里面来,我们需要把p标签里面的样式也做一个处理,这里我换成了span标签。

 function getAllStyle(dom) {
    if (!dom) return;
    const tagName = dom.tagName.toLowerCase();
    if (tagName === 'p') {
      nodeArray.push({
        tagName: 'span',
        attributes: Array.from(dom.attributes).map((i) => {
          return {
            name: i.name,
            value: i.value,
          };
        }),
      });
      return;
    } else {
      nodeArray.push({
        tagName: tagName,
        attributes: Array.from(dom.attributes).map((i) => {
          return {
            name: i.name,
            value: i.value,
          };
        }),
      });
      getAllStyle(dom.parentNode);
    }
  }
  return nodeArray;
}

最后一步,就是把从内到外获取到的节点和属性,按原样套接上去得到最后的节点

function addStyle(text, nodeArray) {
  let currentNode = null;
  nodeArray.forEach((ele, index) => {
    let node = document.createElement(ele.tagName);
    for (const attr of ele.attributes) {
      node.setAttribute(attr.name, attr.value);
    }
    if (index === 0) {
      node.innerText = text;
      currentNode = node;
    } else {
      node.appendChild(currentNode);
      currentNode = node;
    }
  });
  return currentNode;
}

接下来是和编辑器相关的操作就不在赘述了,结合编辑器以及MDN的文档,可以实现大部分功能。
值得一提的是,我这里判断文字选择用的是mouseup的事件,因为暂时也没想到其他的办法,如果有更好的办法,希望不吝赐教。
预览地址:https://snjiang1992.github.io/format-painter/
源码地址:https://github.com/SNJiang1992/format-painter

相关文章

网友评论

      本文标题:基于wangeditor的格式刷

      本文链接:https://www.haomeiwen.com/subject/edrmqltx.html