范围:commonAncestorContainer 属性

Range.commonAncestorContainer 只读属性返回包含 Range边界点 的最深(或在文档树中向下最远)Node。这意味着如果 Range.startContainerRange.endContainer 都引用同一个节点,则该节点就是共同祖先容器

由于 Range 不必是连续的,并且也可能部分选择节点,因此这是查找包含 RangeNode 的便捷方法。

此属性是只读的。要更改 Node 的祖先容器,请考虑使用可用于设置 Range 的起始位置和结束位置的各种方法,例如 Range.setStart()Range.setEnd()

一个 Node 对象。

示例

在此示例中,我们创建了一个事件监听器来处理列表上的 pointerup 事件。监听器获取每个选定文本的共同祖先,并触发动画以突出显示它们。

HTML

html
<ul>
  <li>
    Strings
    <ul>
      <li>Cello</li>
      <li>
        Violin
        <ul>
          <li>First Chair</li>
          <li>Second Chair</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>
    Woodwinds
    <ul>
      <li>Clarinet</li>
      <li>Oboe</li>
    </ul>
  </li>
</ul>

CSS

下面创建的 .highlight 类使用一组 CSS @keyframes 来动画化淡出轮廓。

css
.highlight {
  animation: highlight linear 1s;
}

@keyframes highlight {
  from {
    outline: 1px solid #f00f;
  }
  to {
    outline: 1px solid #f000;
  }
}

JavaScript

js
document.addEventListener("pointerup", (e) => {
  const selection = window.getSelection();

  if (selection.type === "Range") {
    for (let i = 0; i < selection.rangeCount; i++) {
      const range = selection.getRangeAt(i);
      playAnimation(range.commonAncestorContainer);
    }
  }
});

function playAnimation(el) {
  if (el.nodeType === Node.TEXT_NODE) {
    el = el.parentNode;
  }

  el.classList.remove("highlight");
  setTimeout(() => {
    el.classList.add("highlight");
  }, 0);
}

结果

规范

规范
DOM 标准
# ref-for-dom-range-commonancestorcontainer②

浏览器兼容性

BCD 表仅在浏览器中加载

另请参见