Выбор: метод setBaseAndExtent()
Базовая линия Широко доступна
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с марта 2017 года.
Метод setBaseAndExtent() интерфейса Selection устанавливает выделение в виде диапазона, включающего все или части двух указанных узлов DOM, а также любой контент, расположенный между ними.
Якорные и фокусные узлы могут быть расположены в тенистом дереве, если это поддерживается браузером.
Синтаксис
setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset)
Параметры
anchorNode-
Узел, с которого начинается выделение.
anchorOffset-
Количество дочерних узлов от начала якорного узла, которые должны быть исключены из выделения. Например, если значение равно 0, весь узел включается. Если значение равно 1, весь узел минус первый дочерний узел включается. И так далее.
Если
anchorNodeявляется узломText, смещение относится к количеству символов от началаNode.textContent, которые должны быть исключены из выделения. focusNode-
Узел, по которому заканчивается выделение.
focusOffset-
Количество дочерних узлов от начала фокусного узла, которые должны быть включены в выделение. Например, если значение равно 0, весь узел исключается. Если значение равно 1, первый дочерний узел включается. И так далее.
Если
focusNodeявляется узломText, смещение относится к количеству символов от началаNode.textContent, которые должны быть включены в выделение.
Примечание: Если позиция фокуса расположена перед позицией якоря в документе, направление выделения меняется — курсор размещается в начале текста, а не в конце, что важно для любых команд клавиатуры, которые могут следовать за этим. Например, Shift + ➡︎ приведет к сужению выделения с начала, а не к его расширению в конце.
Возвращаемое значение
None (undefined).
Исключения
-
IndexSizeErrorDOMException -
Выбрасывается, если
anchorOffsetбольше, чем количество дочерних узлов внутриanchorNode, или еслиfocusOffsetбольше, чем количество дочерних узлов внутриfocusNode.
Примеры
В этом примере у нас есть два абзаца, содержащие теги span, каждый из которых содержит одно слово. Первый абзац задан как anchorNode, а второй — как focusNode. У нас также есть дополнительный абзац, который находится между двумя узлами.
Далее у нас есть два поля ввода формы, которые позволяют задать anchorOffset и focusOffset — оба имеют значение по умолчанию 0.
У нас также есть кнопка, которая при нажатии вызывает функцию, которая выполняет метод setBaseAndExtent() с заданными смещениями и копирует выделение в выходной абзац в самом низу HTML.
<h1>setBaseAndExtent example</h1>
<div>
<p class="one">
<span>Fish</span><span>Dog</span><span>Cat</span><span>Bird</span>
</p>
<p>MIDDLE</p>
<p class="two">
<span>Car</span><span>Bike</span><span>Boat</span><span>Plane</span>
</p>
</div>
<div>
<p>
<label for="aOffset">Anchor offset</label>
<input id="aOffset" name="aOffset" type="number" value="0" />
</p>
<p>
<label for="fOffset">Focus offset</label>
<input id="fOffset" name="fOffset" type="number" value="0" />
</p>
<p><button>Capture selection</button></p>
</div>
<p><strong>Output</strong>: <span class="output"></span></p>
Примечание: Целенаправленно отсутствуют пробелы между тегами начала <p class="one"> и <p class="two"> и следующими за ними тегами начала <span> — чтобы избежать наличия текстовых узлов, которые повлияли бы на ожидаемое количество дочерних узлов. (Даже если эти текстовые узлы будут содержать только пробелы, они всё равно будут дополнительными дочерними узлами; узнайте больше из примера Node.firstChild).
JavaScript выглядит следующим образом:
const one = document.querySelector(".one");
const two = document.querySelector(".two");
const aOffset = document.getElementById("aOffset");
const fOffset = document.getElementById("fOffset");
const button = document.querySelector("button");
const output = document.querySelector(".output");
let selection;
button.onclick = () => {
try {
selection = document.getSelection();
selection.setBaseAndExtent(one, aOffset.value, two, fOffset.value);
const text = selection.toString();
output.textContent = text;
} catch (e) {
output.textContent = e.message;
}
};
Поиграйте с живым примером ниже, устанавливая различные значения смещений, чтобы увидеть, как это влияет на выделение.
Примечание: Вы можете найти этот пример на GitHub (посмотреть его в действии.)
Спецификации
| Спецификация |
|---|
| API выбора # dom-selection-setbaseandextent |
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
setBaseAndExtent |
1 | 12 | 53 | 15 | 1.3 | 18 | 53 | 14 | 1 | 1.0 | 4.4 |
accepts_nodes_in_shadow_trees |
Нет | Нет | превью | Нет | Нет | Нет | Нет | Нет | Нет | Нет | Нет |
См. также
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/Selection/setBaseAndExtent