Как посчитать сколько раз встречается блок с классом после определенного класса?
У меня есть много блоков:
<div class="calendar">
<div class="day"></div>
<div class="day event"></div>
<div class="day"></div>
<div class="day selected"></div>
<div class="day selected"></div>
<div class="day event"></div>
<div class="day"></div>
<div class="day"></div>
<div class="day selected"></div>
<div class="day selected"></div>
<div class="day event"></div>
<div class="day"></div>
</div>
Как посчитать кол-во блоков с тегами event которые идут только после блоков с классом selected? Именно сразу после. В указанном примере должно вернуть число 2.
Ответы (1 шт):
Автор решения: OPTIMUS PRIME
→ Ссылка
См. CSS - селекторы, в JS они часто помогают)
let events = document.querySelectorAll('.selected + .event');
console.log( events.length );
<div class="day"></div>
<div class="day event"></div>
<div class="day"></div>
<div class="day selected"></div>
<div class="day selected"></div>
<div class="day event"></div>
<div class="day"></div>
<div class="day"></div>
<div class="day selected"></div>
<div class="day selected"></div>
<div class="day event"></div>
<div class="day"></div>
Если бы его не существовало...
let selected = document.querySelectorAll('.selected');
let events = [];
selected.forEach(function(el){
let next = el.nextElementSibling;
if( next.classList.contains('event') ) {
events.push( next );
}
}); // И вариации через reduce / filter
console.log( events.length );
// let e = [...document.querySelectorAll('.event')];
// e = e.filter( ev => ev.previousElementSibling.classList.contains('selected') );
<div class="day"></div>
<div class="day event"></div>
<div class="day"></div>
<div class="day selected"></div>
<div class="day selected"></div>
<div class="day event"></div>
<div class="day"></div>
<div class="day"></div>
<div class="day selected"></div>
<div class="day selected"></div>
<div class="day event"></div>
<div class="day"></div>
P.s. Можно свободно "ходить" во всех направлениях по DOM через:
• nextElementSibling
• previousElementSibling
• parentNode
• children