JS метод Element.isSameNode()


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

isSameNode() - це метод об'єкта Element в JavaScript, який використовується для перевірки, чи два вузли дерева документа є одним і тим самим вузлом в пам'яті. Цей метод повертає логічне значення true, якщо два вузли посилаються на один і той самий об'єкт у пам'яті, і false в іншому випадку.

Основна сфера застосування методу isSameNode() - порівняння вузлів для визначення, чи вони є ідентичними екземплярами об'єктів у пам'яті. Це відрізняється від методу isEqualNode(), який перевіряє, чи вузли мають однакову структуру, атрибути та вміст, але не враховує, чи є вони одним і тим самим об'єктом.

Метод isSameNode() є корисним у ситуаціях, коли потрібно переконатися, що два посилання на вузли насправді посилаються на один і той самий вузол у дереві документа. Це може бути важливо при роботі з подіями, маніпуляціями з DOM та інших випадках, коли потрібно розрізняти окремі екземпляри вузлів.

Розглянемо приклад використання isSameNode() з HTML-документом:

<div id="container">
  <p id="paragraph">Цей абзац</p>
</div>
const container = document.getElementById('container');
const paragraph = document.getElementById('paragraph');
const childNode = container.firstElementChild;

console.log(paragraph.isSameNode(childNode)); // true

У цьому прикладі ми отримуємо вузли div з ідентифікатором container та p з ідентифікатором paragraph. Потім ми отримуємо перший дочірній елемент вузла container, який також є вузлом p. Коли ми виконуємо isSameNode() на вузлах paragraph та childNode, метод повертає true, оскільки вони посилаються на один і той самий об'єкт у пам'яті.

Метод isSameNode() також можна використовувати з XML-документами та іншими типами вузлів, такими як атрибути, коментарі та текстові вузли. Наприклад:

<?xml version="1.0"?>
<root>
  <child id="myChild">Дочірній елемент</child>
</root>
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlString, "application/xml");
const rootNode = xmlDoc.documentElement;
const childNode = rootNode.firstElementChild;
const sameChild = xmlDoc.getElementById('myChild');

console.log(childNode.isSameNode(sameChild)); // true

У цьому прикладі ми створюємо XML-документ та отримуємо дочірній вузол child двома різними способами: через firstElementChild та getElementById(). Оскільки обидва ці посилання вказують на один і той самий вузол у пам'яті, метод isSameNode() повертає true.

Варто зазначити, що isSameNode() є дуже точним методом порівняння вузлів і враховує лише посилання на об'єкти в пам'яті, а не структуру або вміст вузлів. Це відрізняє його від методу isEqualNode(), який перевіряє структурну рівність вузлів, але не враховує, чи є вони одним і тим самим об'єктом у пам'яті.

Крім порівняння окремих вузлів, isSameNode() також можна використовувати для перевірки, чи два посилання на вузли вказують на одну і ту саму підструктуру дерева документа. Наприклад, ви можете перевірити, чи два фрагменти документа є одним і тим самим об'єктом.

const fragment = document.createDocumentFragment();
const p = document.createElement('p');
fragment.appendChild(p);

const sameFragment = fragment;

console.log(fragment.isSameNode(sameFragment)); // true

У цьому прикладі ми створюємо фрагмент документа та додаємо до нього абзац. Потім ми створюємо нове посилання sameFragment, яке вказує на той самий об'єкт фрагмента документа. Коли ми виконуємо isSameNode() на fragment та sameFragment, метод повертає true, оскільки вони посилаються на один і той самий об'єкт у пам'яті.

Загалом, isSameNode() є корисним інструментом для перевірки, чи два посилання на вузли вказують на один і той самий екземпляр об'єкта в пам'яті. Це допомагає забезпечити коректну роботу з DOM, особливо у випадках, коли потрібно розрізняти окремі екземпляри вузлів. Метод isSameNode() доповнює метод isEqualNode(), який перевіряє структурну рівність вузлів, але не враховує їх ідентичність як об'єктів у пам'яті.

автор: Bond

Порада

Пам'ятайте, що isSameNode() відрізняється від методу isEqualNode(). Метод isSameNode() перевіряє, чи посилання вказують на один і той самий об'єкт у пам'яті, тоді як isEqualNode() перевіряє структурну рівність вузлів, але не враховує їх ідентичність як об'єктів.

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

Метод isSameNode() є дуже точним і враховує лише посилання на об'єкти в пам'яті, а не структуру або вміст вузлів. Якщо вам потрібно перевірити структурну рівність вузлів, використовуйте метод isEqualNode() замість isSameNode().

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

Ви можете використовувати isSameNode() для перевірки, чи два посилання на підструктури дерева документа, такі як фрагменти документа, вказують на один і той самий об'єкт. Це може бути корисно для забезпечення коректної роботи з DOM. Наприклад:

const fragment1 = document.createDocumentFragment();
// Додавання вузлів до fragment1

const fragment2 = fragment1;

if (fragment1.isSameNode(fragment2)) {
  console.log('Фрагменти є одним і тим самим об'єктом');
} else {
  console.log('Фрагменти є різними об'єктами');
}
автор: Bond

Синтаксис

isSameNode(otherNode)

Параметри

otherNode

Вузол, який потрібно перевірити на відповідність.

автор: Bond

Повернення

boolean

Повертає булеве значення, яке дорівнює true, якщо обидва вузли строго рівні, і false, якщо ні.

автор: Bond

Переглядачі

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

Приклади

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

У цьому прикладі ми створюємо елемент <div> за допомогою методу document.createElement(). Потім ми отримуємо посилання на той самий вузол у змінній sameNode. Використовуючи метод isSameNode(), ми перевіряємо, чи є ці два посилання посиланнями на той самий об'єкт вузла. Оскільки вони посилаються на один і той самий вузол, метод повертає true. Далі ми створюємо інший елемент <div> та перевіряємо, чи є він тим самим об'єктом, що й початковий вузол. Оскільки це різні об'єкти, метод повертає false.

// Створюємо елемент div
const div = document.createElement('div');

// Отримуємо посилання на той самий вузол
const sameNode = div;

// Перевіряємо, чи вузли є тим самим об'єктом
console.log(div.isSameNode(sameNode)); // true

// Створюємо інший елемент div
const anotherDiv = document.createElement('div');

// Перевіряємо, чи вузли не є тим самим об'єктом
console.log(div.isSameNode(anotherDiv)); // false
автор: Bond

У цьому прикладі ми створюємо функцію findDuplicateNodes, яка приймає кореневий вузол та повертає масив дублікатів вузлів у дереві. Функція використовує рекурсивний підхід для обходу всіх вузлів у дереві.

function findDuplicateNodes(parentNode) {
  const nodeMap = new Map();
  const duplicateNodes = [];

  function traverseNodes(node) {
    if (nodeMap.has(node)) {
      duplicateNodes.push(node);
    } else {
      nodeMap.set(node, true);
    }

    for (const childNode of node.childNodes) {
      traverseNodes(childNode);
    }
  }

  traverseNodes(parentNode);
  return duplicateNodes;
}

// Створюємо дерево вузлів
const parentNode = document.createElement('div');
const child1 = document.createElement('p');
const child2 = document.createElement('p');
const duplicateChild = child1;
parentNode.appendChild(child1);
parentNode.appendChild(child2);
parentNode.appendChild(duplicateChild);

const duplicates = findDuplicateNodes(parentNode);
console.log(duplicates); // [<p>...</p>]
автор: Bond

Цей приклад демонструє використання методу isSameNode() для перевірки, чи є два вузли в DOM ідентичними. На сторінці є два елементи <p>, кожен з яких міститься в окремому контейнері <div>. При натисканні на кнопку "Перевірити, чи вузли ідентичні" виконується функція checkSameNode(), яка отримує ці два вузли за допомогою document.getElementById() і порівнює їх за допомогою isSameNode(). Результат порівняння виводиться у елементі <p> з id="output".

Користувач може візуально побачити, що два вузли не є ідентичними, оскільки вони знаходяться в різних контейнерах. Це демонструє, як працює метод isSameNode() для перевірки ідентичності вузлів у DOM.

автор: 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`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

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

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