Range: commonAncestorContainer-Eigenschaft

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Die schreibgeschützte Eigenschaft Range.commonAncestorContainer gibt den tiefsten — oder am weitesten unten im Dokumentbaum befindlichen — Node zurück, der beide Grenzpunkte des Range enthält. Das bedeutet, dass, wenn Range.startContainer und Range.endContainer sich auf denselben Knoten beziehen, dieser Knoten der gemeinsame Vorfahren-Container ist.

Da ein Range nicht kontinuierlich sein muss und Knoten auch teilweise auswählen kann, ist dies eine bequeme Möglichkeit, einen Node zu finden, der einen Range umschließt.

Diese Eigenschaft ist schreibgeschützt. Um den Vorfahren-Container eines Node zu ändern, können Sie die verschiedenen verfügbaren Methoden verwenden, um die Start- und Endpositionen des Range festzulegen, wie z.B. Range.setStart() und Range.setEnd().

Wert

Ein Node Objekt.

Beispiele

In diesem Beispiel erstellen wir einen Ereignis-Listener, um pointerup-Ereignisse auf einer Liste zu verarbeiten. Der Listener ermittelt die gemeinsamen Vorfahren jedes ausgewählten Textstücks und löst eine Animation aus, um sie hervorzuheben.

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

Die unten erstellte .highlight-Klasse verwendet eine Reihe von CSS-@keyframes, um eine verblassende Umrandung zu animieren.

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

@keyframes highlight {
  from {
    outline: 1px solid red;
  }
  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);
}

Ergebnis

Spezifikationen

Specification
DOM
# ref-for-dom-range-commonancestorcontainer②

Browser-Kompatibilität

Siehe auch