You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何通过JavaScript取消内部邮件编辑器中内容的加粗格式?

解决邮件编辑器取消加粗格式的问题

核心思路

你的现有代码只实现了用<b>标签包裹选中内容的加粗逻辑,要实现取消加粗,需要先判断选中区域是否已经被<b>或<strong>标签包裹,再执行包裹/拆包的切换操作。

完整实现代码

function toggleBold() {
  const selection = window.getSelection();
  if (!selection.rangeCount) return;

  const range = selection.getRangeAt(0).cloneRange();
  let isBold = false;
  let currentNode = range.commonAncestorContainer;

  // 向上遍历节点,检查选中内容是否处于加粗标签内
  while (currentNode && currentNode.nodeType === Node.ELEMENT_NODE) {
    if (currentNode.tagName === 'B' || currentNode.tagName === 'STRONG') {
      isBold = true;
      break;
    }
    currentNode = currentNode.parentNode;
  }

  if (isBold) {
    // 取消加粗:移除<b>/<strong>标签,保留内部内容
    const boldElements = getBoldElementsInRange(range);
    boldElements.forEach(el => {
      const parent = el.parentNode;
      while (el.firstChild) {
        parent.insertBefore(el.firstChild, el);
      }
      parent.removeChild(el);
    });
  } else {
    // 应用加粗:原有包裹逻辑
    const wrapper = document.createElement('b');
    range.surroundContents(wrapper);
  }

  // 恢复选中状态
  selection.removeAllRanges();
  selection.addRange(range);
}

// 辅助函数:获取选中范围内的所有加粗标签
function getBoldElementsInRange(range) {
  const elements = [];
  const walker = document.createTreeWalker(
    range.commonAncestorContainer,
    NodeFilter.SHOW_ELEMENT,
    node => node.tagName === 'B' || node.tagName === 'STRONG' ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP
  );

  let node;
  while ((node = walker.nextNode())) {
    if (range.intersectsNode(node)) {
      elements.push(node);
    }
  }
  return elements;
}

关键逻辑说明

  • 状态判断:通过向上遍历选中内容的祖先节点,判断是否处于<b>/<strong>标签内,确定当前需要执行加粗还是取消加粗
  • 批量处理:用TreeWalker遍历选中范围内的所有加粗标签,确保部分选中或多段加粗内容都能正确取消格式
  • 节点操作:取消加粗时,将标签的子节点直接移到父节点中,再删除加粗标签,完整保留原有内容结构

内容的提问来源于stack exchange,提问作者DIONISIO JANTSCH FELIPPE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 17:35:25