JS метод Element.isEqualNode()


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

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

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

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

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

<div id="container">
  <p>Перший абзац</p>
  <p>Другий абзац</p>
</div>
const container = document.getElementById('container');
const firstP = container.firstElementChild;
const secondP = container.lastElementChild;

const newP = document.createElement('p');
newP.textContent = 'Другий абзац';

console.log(secondP.isEqualNode(newP)); // true

У цьому прикладі ми спочатку отримуємо вузли p з контейнера div. Потім ми створюємо новий вузол p з таким самим текстовим вмістом, як і другий абзац. Коли ми виконуємо isEqualNode() на другому абзаці та новому вузлі, метод повертає true, оскільки вони є структурно ідентичними.

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

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

const newChild = xmlDoc.createElement('child');
newChild.textContent = 'Дочірній елемент';

console.log(childNode.isEqualNode(newChild)); // true

У цьому прикладі ми створюємо XML-документ та порівнюємо існуючий дочірній вузол child з новим вузлом child, який має такий самий текстовий вміст. Метод isEqualNode() повертає true, оскільки вони є ідентичними.

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

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

const fragment1 = document.createDocumentFragment();
const p1 = document.createElement('p');
p1.textContent = 'Перший абзац';
fragment1.appendChild(p1);

const fragment2 = document.createDocumentFragment();
const p2 = document.createElement('p');
p2.textContent = 'Перший абзац';
fragment2.appendChild(p2);

console.log(fragment1.isEqualNode(fragment2)); // true

У цьому прикладі ми створюємо два фрагменти документа, кожен з одним абзацом, і порівнюємо їх за допомогою isEqualNode(). Оскільки фрагменти мають ідентичну структуру та вміст, метод повертає true.

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

автор: Bond

Порада

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

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

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

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

Ви можете використовувати isEqualNode() для порівняння не лише окремих вузлів, але й підструктур дерева документа, таких як фрагменти документа. Це може бути корисно для перевірки коректності маніпуляцій з DOM. Наприклад:

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

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

if (fragment1.isEqualNode(fragment2)) {
  console.log('Фрагменти ідентичні');
} else {
  console.log('Фрагменти відрізняються');
}
автор: Bond

Синтаксис

isEqualNode(otherNode)

Параметри

otherNode

Вузол для порівняння на рівність.

автор: Bond

Повернення

boolean

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

Якщо otherNode дорівнює null, метод isEqualNode() завжди повертає false.

автор: Bond

Переглядачі

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

Приклади

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

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

function areTreesEqual(rootNode1, rootNode2) {
  // Базовий випадок: перевірка на null
  if (!rootNode1 && !rootNode2) {
    return true;
  }

  // Якщо один з вузлів є null, а інший ні, вони не рівні
  if (!rootNode1 || !rootNode2) {
    return false;
  }

  // Перевіряємо, чи є вузли рівними
  if (!rootNode1.isEqualNode(rootNode2)) {
    return false;
  }

  // Рекурсивно перевіряємо дочірні вузли
  const childNodes1 = rootNode1.childNodes;
  const childNodes2 = rootNode2.childNodes;

  if (childNodes1.length !== childNodes2.length) {
    return false;
  }

  for (let i = 0; i < childNodes1.length; i++) {
    if (!areTreesEqual(childNodes1[i], childNodes2[i])) {
      return false;
    }
  }

  return true;
}

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

const root2 = document.createElement('div');
const child2 = document.createElement('p');
child2.textContent = 'Hello';
root2.appendChild(child2);

console.log(areTreesEqual(root1, root2)); // true
автор: Bond

У цьому прикладі ми створюємо два елементи <div> за допомогою методу document.createElement(). Потім ми присвоюємо їм однакові атрибути id та однаковий текстовий вміст. Після цього ми використовуємо метод isEqualNode() для перевірки, чи є ці два вузли рівними. Оскільки вони мають однакові атрибути та вміст, метод повертає true.

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

// Присвоюємо їм однакові атрибути та вміст
div1.setAttribute('id', 'myDiv');
div1.textContent = 'Hello, World!';

div2.setAttribute('id', 'myDiv');
div2.textContent = 'Hello, World!';

// Перевіряємо, чи є вузли рівними
console.log(div1.isEqualNode(div2)); // true
автор: Bond

У цьому прикладі ми маємо два контейнери (#nodeContainer1 та #nodeContainer2), в яких будуть створені вузли для порівняння. Також є кнопка "Створити вузли" та кнопка "Перевірити рівність", яка спочатку вимкнена.

При натисканні на кнопку "Створити вузли" викликається функція createNodes(), яка створює два вузли <div> з однаковим текстовим вмістом ("Вузол 1") та додає їх до відповідних контейнерів. Після цього кнопка "Перевірити рівність" стає активною.

Коли користувач натискає на кнопку "Перевірити рівність", викликається функція checkNodeEquality(). Ця функція отримує перші дочірні вузли з кожного контейнера та використовує метод isEqualNode() для перевірки їхньої рівності. Результат перевірки виводиться у елемент <p> з ідентифікатором output.

Оскільки обидва вузли мають однаковий текстовий вміст, метод isEqualNode() повертає true, і на сторінці відображається повідомлення "Вузли рівні". Якщо вузли будуть відрізнятися за вмістом або атрибутами, метод поверне false, і буде відображено повідомлення "Вузли не рівні".

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

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

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