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

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

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

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

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

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

HTML

<header>
  <h2 class="title">Node: isEqualNode() method</h2>
  <p class="description">Перевіряє, чи є два вузли рівними.</p>
</header>
<main>
  <div class="result">
    <div id="nodeContainer1">
      <!-- Перший вузол буде створений динамічно -->
    </div>
    <div id="nodeContainer2">
      <!-- Другий вузол буде створений динамічно -->
    </div>
    <button id="createNodesButton">Створити вузли</button>
    <button id="checkEqualityButton" disabled>Перевірити рівність</button>
    <p id="output"></p>
  </div>
</main>

CSS

body {
  font-size: 16px;
  line-height: 1.5;
  font-family: monospace;
}

header {
  background-color: #f1f1f1;
  margin-bottom: 25px;
  padding: 15px;
  -webkit-box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
  -moz-box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
  box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
}

header h2.title {
  padding-bottom: 15px;
  border-bottom: 1px solid #999;
}

header p.description {
  font-style: italic;
  color: #222;
}

.result {
  background-color: #f8f8f8;
  padding: 15px;
  -webkit-box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
  -moz-box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
  box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
}

#nodeContainer1, #nodeContainer2 {
  border: 1px solid #ccc;
  padding: 10px;
  margin-bottom: 10px;
}

JS

// Отримуємо елементи
const nodeContainer1 = document.getElementById('nodeContainer1');
const nodeContainer2 = document.getElementById('nodeContainer2');
const createNodesButton = document.getElementById('createNodesButton');
const checkEqualityButton = document.getElementById('checkEqualityButton');
const output = document.getElementById('output');

// Функція для створення вузлів
function createNodes() {
  const node1 = document.createElement('div');
  node1.textContent = 'Вузол 1';
  nodeContainer1.appendChild(node1);

  const node2 = document.createElement('div');
  node2.textContent = 'Вузол 1'; // Однаковий вміст як у node1
  nodeContainer2.appendChild(node2);

  checkEqualityButton.disabled = false;
}

// Функція для перевірки рівності вузлів
function checkNodeEquality() {
  const node1 = nodeContainer1.firstChild;
  const node2 = nodeContainer2.firstChild;

  const areEqual = node1.isEqualNode(node2);
  output.textContent = areEqual ?
  'Вузли рівні' :
  'Вузли не рівні';
}

// Додаємо обробники подій
createNodesButton.addEventListener('click', createNodes);
checkEqualityButton.addEventListener('click', checkNodeEquality);
//# sourceURL=pen.js
автор: 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

Коментарі

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

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

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

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

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