Проблема в том, что ваш код просматривает только первые div
и все элементы .child1
и .child2
.
Чтобы исправить это, измените ваш селектор для выбора по наличию (или отсутствие) .boo
класс:
$('div.boo .child2').addClass('hide');
$('div:not(.boo) .child1').addClass('hide');
.hide { display: none; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
No boo
<span class="child1">
Child 1
<span class="child2">Child 2</span>
</span>
</div>
<div class="boo">
Boo
<span class="child1">
Child 1
<span class="child2">Child 2</span>
</span>
</div>
Также обратите внимание, что если это делается только по причинам пользовательского интерфейса, то вам вообще не следует использовать JS , Это может быть достигнуто только за CSS:
div:not(.boo) .child1,
div.boo .child2 {
display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
No boo
<span class="child1">
Child 1
<span class="child2">Child 2</span>
</span>
</div>
<div class="boo">
Boo
<span class="child1">
Child 1
<span class="child2">Child 2</span>
</span>
</div>
Наконец, обратите внимание, что в элементах span
отсутствует закрывающий тег. Я предполагаю, что это просто опечатка в вопросе, поэтому я исправил это в этом примере.