2009-12-09 3 views
1

Вот мой HTML:JQuery синтаксис селектора вопрос

<form> 
    <dl> 
     <dt>&nbsp;</dt> 
     <dd><input type="hidden"></dd> 

     <dt>Dont hide this one</dt> 
     <dd><input type="text"></dd> 
    </dl> 
</form> 

Я использую JQuery, чтобы скрыть dt/dd элементы, где тип входа спрятанных с этим кодом:

$("input[type=hidden]").each(function() { 
    $(this).parent().hide().prev().hide(); 
}); 

Но я также хотите применить это только к dt, где текст &nbsp;. Как я могу сделать такой выбор?

Обновление: Может быть, мне нужно уточнить: Несколько человек отправили ответы, где он скрывает дд перед проверкой, если содержание DT также &nbsp;. Оба условия должны быть истинными, прежде чем скрыть как dt, так и dd.

Окончательное решение: Вот что я закончил с:

$('input[type=hidden]').filter(function() { 
    return $(this).closest('dd').prev('dt').html() === '&nbsp;'; 
}).each(function() { 
    $(this).closest('dd').hide() 
      .prev('dt').hide(); 
}); 

ответ

3
$("input[type=hidden]").filter(function() { 
    return $(this).parent().prev('dt').html() === "&nbsp;"; 
}).each(function() { 
    $(this).parent().hide().prev().hide(); 
}); 

Это не отберет <dt>foo&nbsp;bar</dt>

который contains('&nbsp;') бы.

Более сжато (с кредитом Emil's answer)

$("input[type=hidden]").filter(function() { 
    return $(this).closest('dd').prev('dt').html() === "&nbsp;"; 
}).closest('dd').hide().prev('dt').hide(); 
+0

Извините, неправильно поняли, что вы пытались сделать. Обновлено – cobbal

+0

отлично! Спасибо! – Andrew

+0

Как люди уже отправили ответы ... и я не могу прокомментировать, код коббала отсутствует: $ ("input [type = hidden]"). Each (function() {$ (this) .parent(). hide(). prev(). filter (function() {return $ (this) .html() === " ";}). hide(); }); возврат – Skawful

1
$("input[type=hidden]").each(function() { 
    $(this).closest('dd').hide() 
      .prev('dt').hide(); 
}); 

Этот код находит ближайший родительский вход с тег dd, скрывает его, затем ищет dt si bling и скрывает его.

+0

+1 для очистки моего кода и что делает его более читаемым. =] – Andrew

0

содержит селектор не соответствует всему контенту, так что он может работать для вас, но это не является идеальным решением. Правильный способ сделать это состоит в использовании функции фильтра:

$('input[type=hidden]').filter(function() { 
    return $(this).prev().html() == '&nbsp;' 
}) 
.each(function() { 
    $(this).hide(); 
    $(this).prev().hide(); 
}); 
+0

это не работает. он в конечном итоге скрывает всю dl. Я только пытаюсь скрыть dt и dd, где dt содержит  , а dd содержит скрытый элемент формы. – Andrew

+0

О, я не понял вопрос правильно, извините. Теперь я изменил код. – eWolf

0

Это также делает трюк (адаптировано из более ранней версии ответа cobbal в):

$("input[type=hidden]").each(function() { 
    if ($(this).parent().prev().filter(function() { 
     return $(this).html() === "&nbsp;"; 
    }).hide().length > 0) { 
     $(this).hide(); 
    } 
}); 
+0

Я не думаю, что пустой набор jQuery оценивает значение false, не будет ли выполняться оператор if? – cobbal

+0

D'oh, спасибо. Исправлено. –

Смежные вопросы