Наповнення JS розділу

Добридень, Пані та Панове, завдяки вам вдалося зібрати більше 19тис грн з необхідних 15тис на впровадження JS розділу.

JS розділ вже впроваджено - переходимо до його наповнення і почнемо бігти довгий марафон, адже JS має більше 1100 різноманітних методів, властивостей, подій і т.д., які необхідно описати.

Будемо працювати, і вдень, і вночі, щоб орієнтовно взимку закінчити наповнювати JS розділ!

Ви також можете допомогти нам в цьому. Долучайтеся до нашої спільноти в дискорді - ставайте її частиною і допомагайте нашому розвитку.

Також, підтримуйте нас матеріально.

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(), який перевіряє структурну рівність вузлів, але не враховує їх ідентичність як об'єктів у пам'яті.

Порада:

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

Порада:

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

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

const fragment2 = fragment1;

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

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

Синтаксис

isSameNode(otherNode)

Параметри

*otherNode

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

Return

boolean

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

Переглядачі

Переглядач

1

48

3

12.1

12

Переглядач

4.4

18

48

1

Переглядач

-

-

Приклади


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

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

У цьому прикладі ми створюємо елемент <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

У цьому прикладі ми створюємо функцію 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>]