Добрый вечер всем. Не могли бы вы помочь мне разобраться с кодом? У меня есть следующий HTML-код: <br/> <pre><code class="html"><div class="nextstep"> <div class="next"><span>1</span></div> <div class="next active"><span>2</span></div> <div class="next"><span>3</span></div> <div class="next active"><span>4</span></div> </div></code></pre> <br/> а также простой скрипт: <br/> <pre><code class="javascript">if ($('.nextstep .next').hasClass('active')) { $('.nextstep .next').find('span').addClass('yes'); } else { $('.nextstep .next').find('span').addClass('no'); };</code></pre> <br/> По логике, если у блока есть класс <code>active</code>, то к элементу следует добавить соответствующий класс. Однако, по какой-то причине код не работает так, как ожидается, и класс добавляется ко всем элементам. Что именно я делаю неправильно? Можете, пожалуйста, объяснить? <br/> <br/>
Ваша проблема заключается в том, как работает метод jQuery `.hasClass()` и в том, что вы используете его с выборкой, которая содержит несколько элементов. Давайте подробнее разберем, что происходит в вашем коде. Когда вы используете `$('.nextstep .next')`, этот селектор выбирает **все** элементы с классом `next` внутри элемента с классом `nextstep`. В вашем случае это четыре `div`: два из них имеют класс `active`, а два — нет. Когда вы вызываете `$('.nextstep .next').hasClass('active')`, он проверяет **только первый элемент** из этой выборки. Если у первого элемента нет класса `active`, `.hasClass()` вернет `false`, и вы добавите класс `no` ко всем элементам `span`. Чтобы исправить это, вам нужно проверять наличие класса `active` для каждого элемента по отдельности. Вот корректированный вариант вашего скрипта: ```javascript $('.nextstep .next').each(function() { if ($(this).hasClass('active')) { $(this).find('span').addClass('yes'); } else { $(this).find('span').addClass('no'); } }); ``` В этом коде используется метод `.each()`, который проходит по каждому элементу из выборки по одному, и для каждого элемента выполняет проверку класса `active`, добавляя соответствующий класс (`yes` или `no`) к элементу `span` внутри него. Таким образом, `active` будет проверяться для каждого элемента `next`, и классы будут добавляться правильно.
$('.nextstep .next')- вернет все html элементы с такими классами
дальше ты работаешь со списком как с одним элементом, ожидаешь что код будет разбирать составляющие списка по отдельности
$(document).ready(function() { // проходим наши элементы циклом $('.nextstep .next').each(function(i, obj) { // проверяем условия для каждого элемента отдельно if ($(obj).hasClass('active')) { // применяем классы к соответствующему спану $(obj).find('span').addClass('yes'); } else { $(obj).find('span').addClass('no'); }; }); });
Ваш код по сути просто переключает класс.
Это пишется в одну строку:
$('.nextstep .next').toggleClass('active');