JS: создание строки селектора CSS из элемента HTML

В JavaScript, если я выбрал элемент HTML, например:

<div id = "some-id" class = "class-1 class-2">...</div>

Есть ли простой способ создать соответствующий селектор CSS/QuerySelector?

"div#some-id.class-1.class-2"

Или это единственный способ построить эту строку вручную, используя tagName, id и classList?

это может поможет
ericmp 02.01.2023 13:47

@ericmp Проще, чем tagName, id и classList?

mplungjan 02.01.2023 13:53

Я немного запутался в том, чего ты хочешь достичь. если вы хотите выбрать элемент по идентификатору, вы можете использовать document.querySelector('#some-id'). не уверен, в чем твой вопрос

ericmp 02.01.2023 13:56

@ericmp спасибо, кажется, это то, о чем я думал. Если вы напишете это как ответ, я отмечу его как ответ (если не появятся лучшие решения).

Peter 02.01.2023 14:00

@Энди, я не пытаюсь выбрать элемент. Я хочу преобразовать элемент в строковое представление в синтаксисе QuerySelector.

Peter 02.01.2023 14:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
83
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

tagName, id и classList довольно просты в использовании, если вам нужен список селекторов.

Если у вас есть ID, остальные вам не нужны:

const divSelectors = tag => [...document.querySelectorAll(tag)]
  .map(tag => tag.id ? `#${tag.id}` : `${tag.tagName.toLowerCase()}${tag.classList.length ? `.${[...tag.classList].join('.')}` : ''}`)
console.info(divSelectors("div"))
<div>...</div>
<div id = "id1" class = "class-1 class-2">...</div>
<div id = "id2" class = "class-3 class-4">...</div>
<div id = "id3" class = "class-5 class-6">...</div>
<div class = "class-7 class-8">...</div>
<div id = "id4">...</div>

Но если вы настаиваете:

const divSelectors = tag => [...document.querySelectorAll(tag)]
  .map(tag => `${tag.tagName.toLowerCase()}${tag.id?`#${tag.id}`:''}${tag.classList.length ? `.${[...tag.classList].join('.')}` : ''}`)
console.info(divSelectors("div"))
<div>...</div>
<div id = "id1" class = "class-1 class-2">...</div>
<div id = "id2" class = "class-3 class-4">...</div>
<div id = "id3" class = "class-5 class-6">...</div>
<div class = "class-7 class-8">...</div>
<div id = "id4">...</div>

Удивительно, но мы можем использовать querySelector для нескольких элементов div с одним и тем же идентификатором.

console.info(document.querySelector("#aDiv").textContent)
console.info(document.querySelector("#aDiv.three.four").textContent)

console.info([...document.querySelectorAll("#aDiv")].map(div => div.textContent))
<div id = "aDiv" class = "one two">First</div>
<div id = "aDiv" class = "three four">Second</div>

Вау, это какой-то сжатый код. 🤩

Peter 02.01.2023 14:05

Есть баг, когда нет классов: <div> -> "div0". Кроме того, если есть идентификатор, то технически вы также можете опустить классы. Но обратите внимание, что в реальном мире есть документы с повторяющимися идентификаторами.

Peter 02.01.2023 14:30

Я исправил небольшую ошибку, из-за которой отсутствовала ведущая точка для классов.

Peter 02.01.2023 14:39

Все снова работает.

mplungjan 02.01.2023 14:48

Поскольку в HTML не может быть «фатальных» ошибок, правило об уникальных идентификаторах больше похоже на рекомендацию. Таким образом, браузеры должны обрабатывать повторяющиеся идентификаторы, так что на самом деле идентификаторы — это просто особый вид класса.

Peter 02.01.2023 14:56

Однако ваш JS может не работать с повторяющимися идентификаторами :)

mplungjan 02.01.2023 14:57

Это возможное решение вашей проблемы

function createCssSelector(el){
    return `${el.nodeName}${el.id ? '#'+el.id : ''}${el.getAttribute('class') ? '.'+el.getAttribute('class').split(' ').join('.') : ''}`;
}

console.info(createCssSelector(document.querySelector('#some-id')));

console.info(createCssSelector(document.querySelector('#some-id-2')));

console.info(createCssSelector(document.querySelector('span')));

console.info(createCssSelector(document.querySelector('#some-id-3')));
<div id = "some-id" class = "class-1 class-2 class-4">...</div>

<p id = "some-id-2" class = "black blue white">...</p>

<span class = "black blue white">...</span>

<p id = "some-id-3" class = "">...</p>

Это прерывается, если классов нет, и всегда будет выводить «#», даже если нет идентификатора. (Я вижу, что мой вопрос не был ясен по этому поводу, отредактировал вопрос.)

Peter 02.01.2023 14:09

Имея этот HTML:

<div id = "some-id" class = "class-1 class-2">...</div>

Вы можете выбрать div, используя различные методы/способы:

document.querySelector("#some-id")

document.querySelector(".class-1.class-2")

document.getElementById("some-id")

document.querySelector("#some-id.class-1.class-2")

...

В зависимости от того, что вы делаете, вы хотите использовать тот или иной. Если нет контекста, я бы придерживался первого.

* (Дополнительный совет) Если вы используете веб-браузер, вы можете:

  1. Откройте DevTools.
  2. Нажмите на значок курсора — «Выберите элемент на странице для его проверки».

  1. Щелкните элемент на странице.
  2. Перейдите в консоль devtools.
  3. Пишите $0. Если вы не вернетесь, он покажет вам полный селектор.

  1. Если вы вернетесь, он зарегистрирует выбранный вами элемент.

Документация:

Вы правы, в основном мне нужна функция, которая возвращает строку, которую вы видите в DevTools. ("div#some-id.класс-1.класс-2")

Peter 02.01.2023 15:34

Другие вопросы по теме