Можем ли мы извлечь селектор запросов из элемента node?

#javascript

#javascript

Вопрос:

Возможно ли извлечь селектор запросов элемента node?

Из списка узлов :

 let targets = document.querySelectorAll(".card .text-data, .section-1")
  

Мне нужно перебрать каждый элемент в targets и снова найти .card .text-data и .section-1 в проанализированном HTML, чтобы получить данные, чтобы я мог сравнить обе версии.

 let parser = new DOMParser();
let parsedHtml = parser.parseFromString(htmlData, 'text/html');

targets.forEach(function (targetElement) {
    let new_data = parsedHtml.querySelector("my selector here")
    if (new_data.innerHTML === targetElement.innerHTML) {
        console.log("Same data")
    } else {
        console.log("There is some difference here")
    }
})
  

parsedHtml — это та же HTML-страница, но с обновленными данными. Мне нужно сопоставить точно такой же элемент node (используя множественный селектор, такой как —> .card .text-data ).

Я мог бы использовать массив селекторов и перебирать его для запроса в исходном DOM и новом. Но на мой вопрос не будет ответа :

Можем ли мы извлечь исходный селектор запроса из элемента node?

Комментарии:

1. Что такое parsedHtml ? Как это связано с документом, по которому вы вызываете querySelectorAll ?

2. О jQuery не может быть и речи?

3. @Ти ДжейКраудер, я обновил свой пост. Это похоже на тот же HTML-документ, но с обновленными данными. Для #Dalibor, да, чистый JS

4. На самом деле не очень понятно, чего вы хотите

5. @Liam Я добавил больше контекста, может быть, лучше?

Ответ №1:

Можем ли мы извлечь исходный селектор запроса из элемента node?

Нет, вы не можете. Элемент может быть найден с использованием широкого спектра селекторов. Ничто в получаемом элементе не сообщает вам, какой селектор использовался для его поиска.

parsedHtml — это та же HTML-страница, но с обновленными данными.

Предполагая, что структура одинакова, вы можете связать их по индексу, см. *** Комментарии для новых / обновленных строк:

 let selector = ".card .text-data, .section-1"; // ***
let targets = document.querySelectorAll(selector); // ***

let parser = new DOMParser();
let parsedHtml = parser.parseFromString(htmlData, 'text/html');

let parsedTargets = document.querySelectorAll(selector); // ***
targets.forEach(function(targetElement, index) {
// *** −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^
    let new_data = parsedTargets[index]; // ***
    if (new_data.innerHTML === targetElement.innerHTML) {
        console.log("Same data")
    } else {
        console.log("There is some difference here")
    }
})
  

Но если элементы перемещались в этих обновлениях данных, то то, как вы их соотносите, будет во многом зависеть от того, каковы эти изменения.


Вы сказали:

Я бы хотел не полагаться на индекс

Вы не сказали почему, но если вы вносите изменения, которые делают недействительным индекс, то вы вносите изменения в дерево, которые, вероятно, сделают невозможным сопоставление элементов по деревьям (если только все они не имеют уникальных идентификаторов или чего-то еще). Любая структура потребует, чтобы деревья были структурно одинаковыми. Даже если вы создали что-то, что, казалось, работало в случаях A, B, C и D, это, скорее всего, сломалось бы в случае X, который никто в команде не подумал протестировать.

Комментарии:

1. Спасибо за ответ, но я бы хотел не полагаться на index. Я мог бы использовать массив селектора, а затем выполнить запрос два раза. Один в исходном DOM, а другой в новом, но я бы предпочел знать, можем ли мы извлечь исходный селектор в элементе node

2. @Baptiste — Я обновил начало ответа. Селектор, используемый для поиска элемента, нигде не хранится; элемент не знает, как он был найден.

3. @Baptiste — «Я бы хотел не полагаться на индекс» Почему бы и нет? Вы вносите изменения, которые сделают индекс недействительным? Если это так, вы не сможете создать селектор на основе элемента в одном дереве, чтобы соответствовать элементу в дереве, который может отличаться от первого.

4. На данный момент нет, но я всегда думаю о том, что могло бы произойти, чтобы сделать его более надежным. Если первый элемент отсутствует в новом DOM (например, нет данных), то индексное решение работать не будет. Но здесь меня больше интересует ответ на мой первый вопрос, чем то, как я могу заставить его работать

5. @Baptiste — Элемент без содержимого все еще находится в DOM. Боюсь, мы не можем дать вам лучших предложений без дополнительной информации. И структурные изменения сведут на нет практически все, что вы делаете.