У меня есть следующая (искусственная) DOM:
<div class="something">xxx</div>
<div class="something">
<div class="essence">yyy</div>
</div>
<div class="something">zzz</div>
<div class="something">
<div class="essence">111</div>
</div>
Затем в $(document).ready
я делаю:
$('.essence').click(function()
{
$(this).parent().prevAll('.something > .essence').toggle();
$(this).parent().nextAll('.something > .essence').toggle();
});
Кажется, это не работает.
В принципе, я хочу скрыть/показать всех предыдущих и следующих братьев и сестер щелкнутого элемента parent, которые не содержат ребенка с тем же классом, что и элемент с щелчком.
Пожалуйста помоги. Извинения, если это кажется неопределенным
Я выделил важные части вашего требования:
Я хочу скрыть всех предшествующих и следующих братьев и сестер щелкнутого элемента parent, которые не содержат дочерний элемент с тем же классом, что и элемент с щелчком.
который будет
$(this).parent().siblings().not(':has(> .' + this.className + ')').hide();
или
var className = this.className;
$(this).parent().siblings().filter(function() {
return $(this).children('.' + className).length === 0;
}).hide();
Объяснение, почему ваш код не работает:
.prevAll
и .nextAll
получите предыдущее для следующих братьев и сестер элемента, если и только если они соответствуют селектору. В вашем случае все братья и сестры имеют something
классное. Селектор не соответствует ни одному из них, потому что это соответствует только элементы с классом essence
, которые являются потомками элементов с классом something
- something
.
Я понимаю, что вы пытались сделать, но не так, как эти методы работают.
Ваш код должен быть заменен на:
$('.essence').click(function()
{
$(this).parent().siblings().not(':has("> div")').toggle();
});
Вы можете использовать расширение: has() следующим образом:
$(this).parent().siblings('.something:has(.essence)').toggle();
Это выберет всех братьев и сестер.parent(), которые относятся к классу.something и содержат потомка класса.essence. Вы также можете сделать это, что, согласно документации, может быть быстрее:
$(this).parent().siblings('.something').has('.essence').toggle();
Это странное поведение, когда я вижу это в действии, поэтому трудно понять, действительно ли это именно то, что вам нужно. Если вы хотите переключить всех братьев и сестер, у которых НЕ есть дочерний класс класса.essence, попробуйте следующее:
$(this).parent().siblings('.something').not(':has(.essence)').toggle();
Вы можете попробовать это
$('.essence').click(function()
{
var className = $(this).attr('class');
$(this).parent().siblings().filter(function(){
return !$(this).children('.'+className).length;
}).toggle();
});
lenght
. Во всяком случае, в jsfiddle это работает так, что он скрывает также предыдущий. .something
с .essence
child
hide()
дляtoggle
как я хочу переключать видимость