#jquery
#jquery
Вопрос:
У меня есть некоторый код, p.words
он скрыт, я пытался судить, если у next div
есть span
тег, тогда покажите p.words
, иначе соблюдайте правило css.
Я использую jquery.next
и jquery.find
, чтобы судить $(this).parent().next('.col').find('span')
, но он покажет все p.words
, даже если у следующего div
нет span
тега
<style>
.words{display:none;}
</style>
<script src="jquery.js"></script>
<script>
$(document).ready(function(){
$('.words').each(function(){
if($(this).parent().next('.col').find('span')){
$(this).css('display','block');
}
});
});
</script>
<a>Voodoo
<p class="words"> 1</p><!-- do not show -->
</a>
<div class="col">
<ul>
<li>ATI Rage128 Pro</li><!-- no span tag -->
</ul>
</div>
<a>NVIDIA
<p class="words"> GeForce2 MX</p><!-- show -->
</a>
<div class="col">
<ul>
<li>
<span>NVIDIA GeForce2 MX 400</span><!-- have span tag -->
</li>
<li>
<span>ATI 9200SE</span>
</li>
</ul>
</div>
Ответ №1:
Изменить
if($(this).parent().next('.col').find('span')){
Для
if($(this).parent().next('.col').find('span').length > 0){
Результатом $(this).parent().next('.col').find('span')
является массив, который может быть или не быть пустым, но всегда будет разрешаться true
в вашем состоянии.
Комментарии:
1. У AlienWebguy все правильно; Я бы также упростил ваш код, чтобы использовать селектор next-siblings, но это суть вашей проблемы.
2. Промежутки не обязательно должны быть братьями и сестрами — он просто хотел знать, содержит ли следующий родной брат родителя какие-либо дочерние
span
узлы. Его последовательность выбора точна.3. Одно небольшое замечание: вместо того, чтобы указанный выше селектор возвращал массив, он возвращает объект jQuery, который также имеет
.length
свойство: api.jquery.com/length4.
console.log($(this).parent().next('.col').find('span')) // []
5.
console.log($(this).parent().next('.col').find('span'));
выводитjQuery()
для меня.
Ответ №2:
Я думаю, вы можете значительно упростить свой код с помощью этого:
http://api.jquery.com/next-siblings-selector/
Кроме того, я думаю, что источником вашей проблемы является то, что find возвращает пустой массив, который не оценивается как «false». Попробуйте этот код:
if ($.find("doesnotexist")){console.log("Hi")}
Ответ №3:
Эта строка является виновником:
if($(this).parent().next('.col').find('span')){
Если <span>
теги не найдены, это не вернет false (он вернет пустой объект jQuery). Попробуйте добавить .length
в конец вашего селектора; который вернет 0, если объект jQuery пуст (0 истинно равно false):
if($(this).parent().next('.col').find('span').length){
Вот jsfiddle приведенного выше изменения в вашем коде: http://jsfiddle.net/qfqJZ /
Ответ №4:
Вам нужно внести небольшое изменение в свой оператор if:
if ($(this).parent().next('.col').find('span').length > 0) {
...