Альтернатива - один фильтр - я считаю, что это работает
$('ul.list-style > li:only-child > strong:only-child').filter(function() {
return !this.nextSibling;
}).parent().parent('ul.list-style').addClass('only-strong');
.only-strong {
color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul class='list-style'>
<li><strong>Must be RED</strong></li>
</ul>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul class='list-style'>
<li>Also must be <strong>RED</strong></li>
</ul>
<ul class='list-style'>
<li>Can't be <strong>Red</strong> with text outside of strong</li>
</ul>
<ul class='list-style'>
<li><strong>Should not be red</strong></li>
<li>has two li's</li>
</ul>
<ul class='list-style'>
<li><strong>Not red</strong> something after strong</li>
<li><strong>and has two li's</strong></li>
</ul>
<ul class='list-style'>
<li><strong>NOT RED </strong><span>there's a span here</span></li>
</ul>
примечание о
return !this.nextSibling;
Это означает, что strong
- последний узел в li
, но вы можете иметьтекстовые узлы перед ним ... если это должен быть ONLY узел в li
return !(this.nextSibling || this.previousSibling);
или даже
return this.nextSibling === this.previousSibling;
, поскольку это только когда-либо верноесли оба null