Выбор
Базовая реализация Широко доступна *
Эта функция хорошо отработана и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с марта 2017 года.
* Некоторые части этой функции могут иметь разную степень поддержки.
Объект Selection представляет собой диапазон текста, выбранный пользователем, или текущую позицию курсора. Каждый document связан с уникальным объектом выбора, который можно получить с помощью document.getSelection() или window.getSelection(), а затем исследовать и изменить.
Пользователь может сделать выбор слева направо (в порядке документа) или справа налево (обратный порядок документа). Якорь — это место, где пользователь начал выбор, а фокус — это место, где пользователь завершил выбор. Если вы делаете выбор с помощью мыши на настольном компьютере, якорь устанавливается в месте нажатия кнопки мыши, а фокус — в месте отпускания кнопки мыши.
Примечание: Якорь и фокус не следует путать с позициями начала и конца выбора. Якорь может быть помещён перед фокусом или наоборот, в зависимости от направления выбора.
Свойства экземпляра
-
Selection.anchorNodeТолько для чтения -
Возвращает
Node, в котором начинается выбор. Может возвращатьnullесли выбор никогда не существовал в документе (например, в iframe, на который никогда не нажимали). -
Selection.anchorOffsetТолько для чтения -
Возвращает число, представляющее смещение якоря выбора внутри
anchorNode. ЕслиanchorNodeявляется узлом текста, это число символов внутри anchorNode, предшествующих якорю. ЕслиanchorNodeявляется элементом, это число дочерних узловanchorNode, предшествующих якорю. -
Selection.directionТолько для чтения -
Строка, описывающая направление текущего выбора.
-
Selection.focusNodeТолько для чтения -
Возвращает
Node, в котором выбор заканчивается. Может возвращатьnullесли выбор никогда не существовал в документе (например, вiframeна который никогда не нажимали). -
Selection.focusOffsetТолько для чтения -
Возвращает число, представляющее смещение фокуса выбора внутри
focusNode. ЕслиfocusNodeявляется узлом текста, это число символов внутриfocusNode, предшествующих фокусу. ЕслиfocusNodeявляется элементом, это число дочерних узловfocusNode, предшествующих фокусу. -
Selection.isCollapsedТолько для чтения -
Возвращает логическое значение, указывающее, находятся ли начальная и конечная точки выбора в одной позиции.
-
Selection.rangeCountТолько для чтения -
Возвращает количество диапазонов в выборе.
-
Selection.typeТолько для чтения -
Возвращает строку, описывающую тип текущего выбора.
Методы экземпляра
Selection.addRange()-
Объект
Range, который будет добавлен в выбор. Selection.collapse()-
Сжимает текущий выбор до одной точки.
Selection.collapseToEnd()-
Сжимает выбор до конца последнего диапазона в выборе.
Selection.collapseToStart()-
Сжимает выбор до начала первого диапазона в выборе.
Selection.containsNode()-
Указывает, является ли определённый узел частью выбора.
Selection.deleteFromDocument()-
Удаляет содержимое выбора из документа.
Selection.empty()-
Удаляет все диапазоны из выбора, оставляя свойства
anchorNodeиfocusNodeравнымиnullи ничего не выбранным. Selection.extend()-
Перемещает фокус выбора в указанную точку.
-
Selection.getComposedRanges()Экспериментально -
Возвращает массив объектов
StaticRange, каждый из которых представляет собой выбор, который может пересекать границы DOM-теневых элементов. Selection.getRangeAt()-
Возвращает объект
Range, представляющий один из диапазонов, которые в данный момент выбраны. Selection.modify()-
Изменяет текущий выбор.
Selection.removeRange()-
Удаляет диапазон из выбора.
Selection.removeAllRanges()-
Удаляет все диапазоны из выбора.
Selection.selectAllChildren()-
Добавляет всех потомков указанного узла в выбор.
Selection.setBaseAndExtent()-
Устанавливает выбор так, чтобы он включал все или части двух указанных узлов DOM и любое содержимое, расположенное между ними.
Selection.setPosition()-
Сжимает текущий выбор до одной точки.
Selection.toString()-
Возвращает строку, в настоящее время представляемую объектом выбора, т. е. текущий выбранный текст.
Примечания
Строковое представление выбора
Вызов метода Selection.toString() возвращает текст, содержащийся в выборе, например:
const selObj = window.getSelection(); window.alert(selObj);
Обратите внимание, что использование объекта выбора в качестве аргумента для window.alert вызовет метод toString объекта.
Несколько диапазонов в выборе
Объект выбора представляет собой Range, которые пользователь выбрал. Обычно он содержит только один диапазон, к которому можно обратиться следующим образом:
const selObj = window.getSelection(); const range = selObj.getRangeAt(0);
-
selObjявляется объектом Selection -
rangeявляется объектомRange
Как отмечается в спецификации Selection API, API Selection был первоначально разработан компанией Netscape и позволял работать с несколькими диапазонами (например, для выбора столбца из <table>). Однако браузеры, отличные от Gecko, не реализовали работу с несколькими диапазонами, и спецификация также требует, чтобы выбор всегда содержал один диапазон.
Выбор и фокус ввода
Выбор и фокус ввода (указанный Document.activeElement) имеют сложные взаимоотношения, которые различаются в разных браузерах. В кроссбраузерном коде лучше обрабатывать их отдельно.
Safari и Chrome (в отличие от Firefox) в настоящее время фокусируют элемент, содержащий выбор, при программно изменении выбора; возможно, это может измениться в будущем (см. W3C ошибку 14383 и WebKit ошибку 38696).
Поведение API выбора с точки зрения изменений фокуса в редактируемом узле
API выбора имеет общее поведение (то есть, общее для браузеров), которое управляет тем, как изменяется поведение фокуса для элементов редактирования после вызова определённых методов.
Поведение следующее:
- Элемент редактирования получает фокус, если предыдущий выбор находился вне него.
- Вызывается метод API выбора, вызывая создание нового выбора с диапазоном выбора внутри элемента редактирования.
- Затем фокус перемещается в элемент редактирования.
Примечание: Методы API выбора могут перемещать фокус только в элемент редактирования, а не в другие фокусируемые элементы (например, <a>).
Вышеуказанное поведение применяется к выборам, сделанным с помощью следующих методов:
Selection.collapse()Selection.collapseToStart()Selection.collapseToEnd()Selection.extend()Selection.selectAllChildren()Selection.addRange()Selection.setBaseAndExtent()
И когда Range изменяется с помощью следующих методов:
Глоссарий
Другие ключевые термины, используемые в этом разделе.
- якорь
-
Якорь выбора — это начальная точка выбора. При выделении с помощью мыши якорь — это место в документе, где нажата кнопка мыши. По мере изменения выбора пользователем с помощью мыши или клавиатуры якорь не перемещается.
- элемент редактирования
-
Редактируемый элемент (например, элемент HTML с
contenteditableустановленным или дочерний элемент HTML документа, у которого включенdesignMode). - фокус выбора
-
Фокус выбора — это конечная точка выбора. При выделении с помощью мыши фокус — это место в документе, где отпускается кнопка мыши. По мере изменения выбора пользователем с помощью мыши или клавиатуры фокус — это конечная точка выбора, которая перемещается.
Примечание: Это не то же самое, что фокусированный элемент документа, возвращаемый
document.activeElement. - диапазон
-
Диапазон — это непрерывная часть документа. Диапазон может содержать целые узлы, а также части узлов (например, часть текстового узла). Пользователь обычно выбирает только один диапазон за раз, но возможно выбрать несколько диапазонов (например, с помощью клавиши Control). Диапазон можно получить из выбора в виде объекта
range. Объекты диапазона также могут быть созданы через DOM и программно добавлены или удалены из выбора.
Спецификации
| Спецификация |
|---|
| API выбора # selection-interface |
Совместимость с браузерами
| Рабочий стол | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
Selection |
1 | 12 | 1 | 9 | 1.3 | 18 | 4 | 10.1 | 1 | 1.0 | 4.4 |
|---|---|---|---|---|---|---|---|---|---|---|---|
addRange |
1 | 12 | 1 | ≤12.1 | 3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
anchorNode |
1 | 12 | 1 | ≤12.1 | 1.3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
anchorOffset |
1 | 12 | 1 | ≤12.1 | 1.3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
collapse |
1 | 12 | 1 | ≤12.1 | 1.3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
collapseToEnd |
1 | 12 | 1 | ≤12.1 | 1.3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
collapseToStart |
1 | 12 | 1 | ≤12.1 | 1.3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
containsNode |
1 | 12 | 1До Firefox 35, метод не выдавал ошибку, еслиnode был null. |
≤12.1 | 3.1 | 18 | 4До Firefox для Android 35, метод не выдавал ошибку, еслиnode был null. |
≤12.1 | 2 | 1.0 | 4.4 |
deleteFromDocument |
1 | 12 | 1 | ≤12.1 | 3.1 | 18 | 4 | ≤12.1 | 2 | 1.0 | 4.4 |
direction |
Нет | Нет | 126 | Нет | 17 | Нет | 126 | Нет | 17 | Нет | Нет |
empty |
1 | 12 | 55 | 15 | 1.3 | 18 | 55 | 14 | 1 | 1.0 | 4.4 |
extend |
1 | 12 | 1 | ≤12.1 | 3.1 | 18 | 4 | ≤12.1 | 2 | 1.0 | 4.4 |
focusNode |
1 | 12 | 1 | ≤12.1 | 1.3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
focusOffset |
1 | 12 | 1 | ≤12.1 | 1.3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
getComposedRanges |
Нет | Нет | предварительный просмотр | Нет | 17 | Нет | Нет | Нет | 17 | Нет | Нет |
getRangeAt |
1 | 12 | 1 | ≤12.1 | 3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
isCollapsed |
1 | 12 | 1 | ≤12.1 | 1.3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
modify |
1 | 79 | 4 | 15 | 1.3 | 18 | 4 | 14 | 1 | 1.0 | 4.4 |
rangeCount |
1 | 12 | 1 | ≤12.1 | 3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
removeAllRanges |
1 | 12 | 1 | ≤12.1 | 3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
removeRange |
58 | 12 | 1 | 45≤12.1–15 | 17 | 58 | 4 | 43≤12.1–14 | 17 | 7.0 | 58 |
selectAllChildren |
1 | 12 | 1 | ≤12.1 | 3.1 | 18 | 4 | ≤12.1 | 2 | 1.0 | 4.4 |
setBaseAndExtent |
1 | 12 | 53 | 15 | 1.3 | 18 | 53 | 14 | 1 | 1.0 | 4.4 |
setPosition |
1 | 14 | 55 | 15 | 1.3 | 18 | 55 | 14 | 1 | 1.0 | 4.4 |
toString |
1 | 12 | 1 | ≤12.1 | 1.3 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
type |
1 | 12 | 57 | 15 | 1.3 | 18 | 57 | 14 | 1 | 1.0 | 4.4 |
См. также
-
Window.getSelection,Document.getSelection,Range - События, связанные с выделением:
selectionchangeиselectstart - HTML-входы предоставляют более простые вспомогательные API для работы с выделением (см.
HTMLInputElement.setSelectionRange()) -
Document.activeElement,HTMLElement.focusиHTMLElement.blur
© 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