0

Что такое anchorNode, baseNode, extentNode и focusNode в объекте, возвращаемом document.getSelection?

12

У меня возникла проблема при работе с выделением текста на HTML-странице. Когда я выполняю следующий код:

var a = document.getSelection();

Я получаю объект, у которого есть четыре свойства:

  1. anchorNode
  2. baseNode
  3. extentNode
  4. focusNode

Значения первых трех свойств совпадают — это текст, который я выделил. Однако я не понимаю, в чем их различия и какое из этих свойств мне следует использовать в определенной ситуации?

Буду признателен за помощь!

3 ответ(ов)

0

Я не эксперт, но из моих экспериментов следует, что anchorNode — это узел, с которого началось выделение, а focusNode — это тот, на котором оно закончилось (предположительно, потому что на нем установлен фокус после завершения выделения).

Что касается baseNode, то он, похоже, совпадает с anchorNode, а extentNode аналогичен `baseNode. Однако стоит отметить, что эти свойства отсутствуют в Firefox и присутствуют только в Chrome.

0

Да, вы правы. anchorNode и focusNode — это свойства интерфейса Range, которые присутствуют во всех современных браузерах. Они используются для определения начала и конца выделенного текста.

Однако baseNode и extentNode — это свойства, которые доступны только в браузере Google Chrome. Они служат для аналогичных целей, но могут не поддерживаться в других браузерах. Поэтому, если вы разрабатываете кросс-браузерное приложение, рекомендуется использовать anchorNode и focusNode для обеспечения совместимости.

Если вам нужно работать с baseNode и extentNode, стоит делать это с учетом того, что ваш код может не работать в других браузерах.

0

На момент написания этого ответа и начиная с 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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь