Что такое anchorNode, baseNode, extentNode и focusNode в объекте, возвращаемом document.getSelection?
У меня возникла проблема при работе с выделением текста на HTML-странице. Когда я выполняю следующий код:
var a = document.getSelection();
Я получаю объект, у которого есть четыре свойства:
- anchorNode
- baseNode
- extentNode
- focusNode
Значения первых трех свойств совпадают — это текст, который я выделил. Однако я не понимаю, в чем их различия и какое из этих свойств мне следует использовать в определенной ситуации?
Буду признателен за помощь!
3 ответ(ов)
Я не эксперт, но из моих экспериментов следует, что anchorNode
— это узел, с которого началось выделение, а focusNode
— это тот, на котором оно закончилось (предположительно, потому что на нем установлен фокус после завершения выделения).
Что касается baseNode
, то он, похоже, совпадает с anchorNode
, а extentNode
аналогичен `baseNode. Однако стоит отметить, что эти свойства отсутствуют в Firefox и присутствуют только в Chrome.
Да, вы правы. anchorNode
и focusNode
— это свойства интерфейса Range
, которые присутствуют во всех современных браузерах. Они используются для определения начала и конца выделенного текста.
Однако baseNode
и extentNode
— это свойства, которые доступны только в браузере Google Chrome. Они служат для аналогичных целей, но могут не поддерживаться в других браузерах. Поэтому, если вы разрабатываете кросс-браузерное приложение, рекомендуется использовать anchorNode
и focusNode
для обеспечения совместимости.
Если вам нужно работать с baseNode
и extentNode
, стоит делать это с учетом того, что ваш код может не работать в других браузерах.
На момент написания этого ответа и начиная с 2018 года, по информации, полученной из кода Chromium и Safari:
baseNode
является алиасом дляanchorNode
baseOffset
является алиасом дляanchorOffset
extentNode
является алиасом дляfocusNode
extentOffset
является алиасом дляfocusOffset
Это подтверждается следующим кодом:
Node* DOMSelection::baseNode() const {
return anchorNode();
}
unsigned DOMSelection::baseOffset() const {
return anchorOffset();
}
Node* DOMSelection::extentNode() const {
return focusNode();
}
unsigned DOMSelection::extentOffset() const {
return focusOffset();
}
Данный код извлечен из кодовой базы Chromium и изначально был создан Apple (смотрите авторские права в верхней части файла). Ссылка на репозиторий: Chromium GitHub
Последний коммит, обновляющий это поведение, был сделан в 2018 году: Коммит на GitHub
Потеряно HTML-кодирование при чтении атрибута из поля ввода
jQuery/JavaScript: Замена битых изображений
Как создать WYSIWYG-редактор на HTML/JS? [закрыто]
Как выполнить код после сброса HTML-формы с помощью jQuery?
Можно ли задать имя файла объекта PDF, отображаемого в Chrome?