JS метод Element.compareDocumentPosition()


Загальний опис

Метод compareDocumentPosition() є корисним інструментом у JavaScript, який дозволяє порівнювати позиції елементів у DOM-дереві. Цей метод дозволяє визначити, чи є один елемент дочірнім, батьківським, нащадком чи сусіднім до іншого елемента. Він повертає числове значення, що кодує різні відносини між елементами, з якими ви можете працювати.

Основна суть методу compareDocumentPosition() полягає в тому, що він надає можливість визначити відносини між елементами у DOM-структурі, що може бути корисним у випадках, коли вам потрібно взаємодіяти з різними елементами сторінки або визначати їхні взаємини.

Один з основних способів використання методу compareDocumentPosition() - це визначення, чи є один елемент нащадком іншого. Наприклад:

const parentElement = document.getElementById('parent');
const childElement = document.getElementById('child');

const position = parentElement.compareDocumentPosition(childElement);

if (position & Node.DOCUMENT_POSITION_CONTAINED_BY) {
    console.log('childElement є нащадком parentElement');
}

У цьому прикладі ми перевіряємо, чи є childElement нащадком parentElement, використовуючи метод compareDocumentPosition(). Якщо результат містить Node.DOCUMENT_POSITION_CONTAINED_BY, то це означає, що childElement є нащадком parentElement.

Крім того, метод compareDocumentPosition() може бути використаний для визначення порядку елементів у DOM-структурі. Наприклад:

const element1 = document.getElementById('element1');
const element2 = document.getElementById('element2');

const position = element1.compareDocumentPosition(element2);

if (position & Node.DOCUMENT_POSITION_FOLLOWING) {
    console.log('element1 передує element2 у DOM');
} else if (position & Node.DOCUMENT_POSITION_PRECEDING) {
    console.log('element1 слідує за element2 у DOM');
}

У цьому прикладі ми визначаємо, чи element1 слідує за element2 у DOM-структурі або передує йому, використовуючи метод compareDocumentPosition().

Загалом, метод compareDocumentPosition() є потужним інструментом для порівняння позицій елементів у DOM-структурі. Він дозволяє вам взаємодіяти з елементами сторінки та визначати їхні взаємні відносини, що робить його корисним у широкому спектрі сценаріїв веб-розробки.

автор: Bond

Порада

Початківцям важливо зрозуміти, що метод compareDocumentPosition() дозволяє порівняти розташування двох елементів в DOM-дереві. Для використання цього методу необхідно мати знання про структуру документа та розуміння його внутрішньої організації.

автор: Bond
Порада

Досвідченим програмістам важливо пам'ятати, що compareDocumentPosition() повертає комбінацію флагів, що вказують на відносини між елементами: чи є один елемент предком, нащадком, сусідом або самим собою відносно іншого елемента. Це дозволяє ефективно керувати порядком елементів у документі та виконувати необхідні маніпуляції з DOM.

автор: Bond
Порада

Порада для початківців: перед використанням compareDocumentPosition() варто вивчити структуру DOM та збагатити розуміння про взаємозв'язки між елементами. Наприклад, можна використовувати інструменти браузера для вивчення DOM-структури та її взаємозв'язків.

автор: Bond

Синтаксис

compareDocumentPosition(otherElement)

Параметри

otherElement

Елемент, для якого потрібно повідомити позицію відносно даного елементу.

автор: Bond

Повернення

Element

Повертає ціле значення, що представляє позицію otherElement відносно даного елементу як комбінацію флагів. Ці флаги відображають різні відносини між елементами, такі як DOCUMENT_POSITION_DISCONNECTED, DOCUMENT_POSITION_PRECEDING, DOCUMENT_POSITION_FOLLOWING, DOCUMENT_POSITION_CONTAINS, DOCUMENT_POSITION_CONTAINED_BY, та DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC. Більше одного біта встановлено, якщо застосовуються різні сценарії. Наприклад, якщо otherNode знаходиться раніше у документі та містить елемент, на якому було викликано compareDocumentPosition(), тоді встановлюються біти DOCUMENT_POSITION_CONTAINS та DOCUMENT_POSITION_PRECEDING, що дає значення 10 (0x0A).

автор: Bond

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
2 1 4 ≤12.1 12 9
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
4.4 18 4 3.2

Приклади

+ запропонувати свій приклад у пісочниці

У цьому простому прикладі ми використовуємо метод compareDocumentPosition() для порівняння позиції двох елементів element1 та element2. Метод повертає комбінований бітовий результат, який можна розшифрувати за допомогою значень констант Node.DOCUMENT_POSITION_FOLLOWING та Node.DOCUMENT_POSITION_PRECEDING, щоб визначити взаємне розташування елементів у документі.

HTML

<div id="`element1`">Демонстраційний елемент</div>
<div id="`element2`">Демонстраційний елемент</div>

JS

// HTML розмітка
// <div id="element1">Element 1</div>
// <div id="element2">Element 2</div>

// JavaScript код
const element1 = document.getElementById("`element1`");
const element2 = document.getElementById("`element2`");

const position = element1.compareDocumentPosition(element2);

if (position & Node.DOCUMENT_POSITION_FOLLOWING) {
  console.log("`element1` знаходиться перед `element2` у документі");
} else if (position & Node.DOCUMENT_POSITION_PRECEDING) {
  console.log("`element1` знаходиться після `element2` у документі");
} else {
  console.log("`element1` та `element2` знаходяться у різних гілках документа");
}
автор: Bond

У цьому складнішому прикладі ми порівнюємо позиції елементів element1 та element2 відносно контейнера container. Використовуючи метод compareDocumentPosition(), ми визначаємо, чи один елемент знаходиться всередині іншого або чи один елемент містить інший. Цей приклад демонструє можливості використання методу compareDocumentPosition() для визначення взаємного розташування елементів у складних структурах документа.

HTML

<div id="`container`">Демонстраційний елемент</div>
<div id="`element1`">Демонстраційний елемент</div>
<div id="`element2`">Демонстраційний елемент</div>

JS

// HTML розмітка
// <div id="container">
//   <div id="element1">Element 1</div>
//   <div id="element2">Element 2</div>
// </div>

// JavaScript код
const container = document.getElementById("`container`");
const element1 = document.getElementById("`element1`");
const element2 = document.getElementById("`element2`");

const position1 = container.compareDocumentPosition(element1);
const position2 = container.compareDocumentPosition(element2);

if (position1 & Node.DOCUMENT_POSITION_CONTAINED_BY) {
  console.log("`element1` знаходиться всередині `container`");
}

if (position2 & Node.DOCUMENT_POSITION_CONTAINS) {
  console.log("`container` містить `element2`");
}
автор: Bond

У цьому прикладі ми маємо два вузли (node1 та node2) у контейнері. При натисканні кнопки "Порівняти вузли" виконується метод compareDocumentPosition(), який порівнює позицію цих двох вузлів у дереві документа. Результат порівняння виводиться у <div> з класом output.

Користувач може взаємодіяти з прикладом, натискаючи на кнопку "Порівняти вузли". Це продемонструє використання методу compareDocumentPosition() для визначення відносного розташування двох вузлів у дереві документа.

Метод compareDocumentPosition() повертає бітову маску, яка вказує на різні можливі відносини між вузлами. У прикладі ми перевіряємо ці біти та формуємо відповідний текстовий опис відносного розташування вузлів.

Наприклад, якщо вузли не пов'язані між собою, буде виведено "Вузли не пов'язані між собою". Якщо Вузол 1 передує Вузлу 2, буде виведено "Вузол 1 передує Вузлу 2". Якщо Вузол 1 містить Вузол 2, буде виведено "Вузол 1 містить Вузол 2" і так далі.

Цей приклад демонструє, як використовувати метод compareDocumentPosition() для визначення відносного розташування двох вузлів у дереві документа, а також ілюструє різні можливі відносини між вузлами.

автор: Bond

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід