Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Точный поиск элемента по классу (https://javascript.ru/forum/misc/70059-tochnyjj-poisk-ehlementa-po-klassu.html)

surru 07.08.2017 18:20

Точный поиск элемента по классу
 
День добрый. Собственно суть. Есть, допустим, много дивов вот с такими именами классов:
<div class="event-container closed-task cancelled-task    ">
<div class="event-container closed-task cancelled-task CANCELLED    ">

Использую:
getElementsByClassName('event-container closed-task cancelled-task')
Мне возвращается nodelist с дивами имеющими оба описанных выше именами классов. Собственно вопрос - как в getElementsByClassName сделать поиск по точному совпадению имени класса?

laimas 07.08.2017 18:24

'event-container.closed-task.cancelled-task'

ksa 08.08.2017 08:33

Цитата:

Сообщение от laimas (Сообщение 460892)
'event-container.closed-task.cancelled-task'

Это не сработает... :no:

<div class="event-container closed-task cancelled-task CANCELLED"></div>
<script type='text/javascript'>
var o=document.getElementsByClassName('event-container.closed-task.cancelled-task');
alert(o.length);
</script>

ksa 08.08.2017 08:41

Цитата:

Сообщение от surru
как в getElementsByClassName сделать поиск по точному совпадению имени класса?

Почему именно getElementsByClassName?

Можно например так...
<div class="event-container closed-task cancelled-task"></div>
<div class="event-container closed-task cancelled-task CANCELLED"></div>
<script type='text/javascript'>
var o=document.querySelectorAll('.event-container.closed-task.cancelled-task:not(.CANCELLED)');
alert(o.length);
</script>

laimas 08.08.2017 08:44

Цитата:

Сообщение от ksa
Это не сработает.

Сработает:

document.querySelector('.event-container.closed-task.cancelled-task')

ksa 08.08.2017 08:48

Цитата:

Сообщение от laimas
Сработает

И это не сработает... :no:
1. Автору нужно работать с getElementsByClassName
2. Твой вариант просто выберет первое совпадение. Если использовать querySelectorAll с твоим селектором - так же выберется 2 элемента

<div class="event-container closed-task cancelled-task"></div>
<div class="event-container closed-task cancelled-task CANCELLED"></div>
<script type='text/javascript'>
var o=document.querySelectorAll('.event-container.closed-task.cancelled-task');
alert(o.length);
</script>

laimas 08.08.2017 08:52

Цитата:

Сообщение от ksa
Твой вариант просто выберет первое совпадение.

Ну это уже не мои проблемы, заказан поиск по составному классу, пусть применяет метод подобающий, а то что querySelectorAll выберет несколько, то так и должно. Если нужно выбрать N-ый из этого набора, значит пусть указывает дополнительный селектор, какие проблемы?

ksa 08.08.2017 08:53

Цитата:

Сообщение от laimas
Ну это уже не мои проблемы

Потопил... :haha:

ksa 08.08.2017 08:55

Цитата:

Сообщение от laimas
Если нужно выбрать N-ый из этого набора, значит пусть указывает дополнительный селектор, какие проблемы?

Автору нужны элементы только (!) с таким набором. Элементы с такими классами + еще какие-то ему не нужны.
Т.о. твой селектор ему не поможет. :no:

laimas 08.08.2017 09:23

Цитата:

Сообщение от ksa
Автору нужны элементы только (!) с таким набором.

Я не знаю какие у него наборы, но если указанного составного класса и исключая .... кто мешает добавить :not(....)?

ksa 08.08.2017 10:35

Цитата:

Сообщение от laimas
Я не знаю какие у него наборы

Он их показал в своем сообщении...
Цитата:

Сообщение от laimas
кто мешает добавить :not(....)?

Его вопрос в том и состоял
Цитата:

Сообщение от surru
как в getElementsByClassName сделать поиск по точному совпадению имени класса?

Суть в том, что твои "ответы" ему не помогут. :no:
Вот собственно и все.

laimas 08.08.2017 10:39

Цитата:

Сообщение от ksa
Суть в том, что твои "ответы" ему не помогут.

Я вообще-то о составных классах только и сказал. Если ответ и надо без последнего, то

document.querySelectorAll('.event-container.closed-task.cancelled-task:not(.CANCELLED)');


А нет, так нет.

j0hnik 08.08.2017 12:32

лучше так.
var divs = [].filter.call(document.querySelectorAll('.event-container.closed-task.cancelled-task'), el => el.classList.length == 3);

laimas 08.08.2017 12:40

Цитата:

Сообщение от j0hnik
лучше так.

Это то с учетом того, что el => el.... не под всеми браузерами будет работать?

j0hnik 08.08.2017 12:56

Цитата:

Сообщение от laimas (Сообщение 460963)
Это то с учетом того, что el => el.... не под всеми браузерами будет работать?

в каких то древних может не работать.

var divs = [].filter.call(document.querySelectorAll('.event-container.closed-task.cancelled-task'), function(el) {
  return el.classList.length === 3;
});

laimas 08.08.2017 13:01

Цитата:

Сообщение от j0hnik
в каких то древних может не работать.

Даже так. Не все и современные имеют поддержку стрелочных функций, это IE, Safari, Opera тоже как бы. В моб. устройствах тоже самое.

j0hnik 08.08.2017 18:41

Цитата:

Сообщение от Rise (Сообщение 460995)
surru,
Если прямо точно точно то так:
document.querySelectorAll('[class="event-container closed-task cancelled-task"]');

:thanks:


Часовой пояс GMT +3, время: 05:53.