2015-01-14 4 views
-1

В настоящее время у меня есть <a> witin a <li> который при нажатии открывается подменю.jQuery по щелчку <a> не будет работать функция

Теперь я хочу сделать так, чтобы вы нажмете на это <a>, когда у его родителя есть класс .open, он закрывается. Но он не срабатывает.

HTML-:

<li class="menu-item-has-children open"> 
    <a href="#">emerging market</a> 
    <ul class="sub-menu"> 
     [sub menu stuff] 
    </ul> 
</li> 

Итак, когда вы щелкаете .open a, он должен первым hidesibling ul .sub-menu, а затем removeClassopen из parent

JQuery

jQuery(".open a").click(
    function(){ 
     console.log('here!'); // this never seems to fire 
     jQuery(this).sibling(".sub-menu").hide(); 
     jQuery(this).parent().removeClass("open"); 
}); 

JS Скрипка, показывающая (рабочая) функция открытия, но функция нерабочим закрытия

http://jsfiddle.net/aa5brt5v/

+1

Ваш JQuery в document.ready вызова или в конце документа? Это работает для меня: http://jsfiddle.net/j08691/70jryhj1/ (BTW это 'siblings' (множественное число), а не' sibling'). – j08691

ответ

4

Почему бы не использовать просто переключите список ребенка?

$(".menu-item-has-children").click(function() { 
 
    $(this).find(".sub-menu").toggle(); 
 
});
/* Default is to hide sub menu */ 
 
ul.sub-menu { 
 
    display: none; 
 
    background-color: orange; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<li class="menu-item-has-children"> <a href="#">emerging market</a> 
 
    <ul class="sub-menu"> 
 
    <li>[sub menu stuff]</li> 
 
    </ul> 
 
</li>

+1

Очень элегантное решение. –

+0

Это намного больше смысла, классическое переоценивание! Проблема, с которой я столкнулась, заключается в том, что «find», похоже, неправильно нацеливается. Есть фактически суб-подменю. Вот сценарий для объяснения: http://jsfiddle.net/aa5brt5v/3/ – Francesca

+1

Вы ищете что-то еще в этой строке: http://jsfiddle.net/j08691/ct5vcohs/? – j08691

1

Попробуйте с помощью этого (делегирования событий):

$(".menu-item-has-children a").on("click", ".open", function() { 
console.log('here!'); 
}); 
+0

yeash, кажется, что вам не хватает делегирования событий, что дает этот ответ. –

+0

@eg_dac - Зачем нужна делегирование событий? – j08691

+0

в случае изменения элемента, который может быть изменен «на лету», поэтому проигрывает событие. –

2

Выпуска потому что события назначены на DOMReady. В то время нет элементов .open, поскольку вы добавляете этот класс при щелчке элемента, что хорошо после запуска DOMReady. Вместо этого вы можете использовать одно событие click для элемента. Вы можете также привести в порядок вашу логику и DOM Traversal немного слишком, попробуйте это:

$(".menu-item-has-children").click(function() { 
    if ($(this).hasClass('open')) { 
     $(this).removeClass("open").find(".sub-menu").hide(); 
    } else { 
     $(this).addClass("open").find(".sub-menu").show(); 
    } 
}); 

Updated fiddle

+0

Я не могу заставить эту работу работать. Он больше не добавляет класс «open» – Francesca