2012-04-02 2 views
0

Я использую метод jQuery .toggle для создания меню, которое открывается и закрывается при нажатии на div. Вот мой код:«un» переключение div с jQuery

$(".header").toggle(function() { 
     $(this).find(".parent").fadeIn("fast"); 
     $(this).css("background-color","red");   
    }, function() { 
     $(this).find(".parent").fadeOut("fast"); 
     $(this).css("background-color","white");  
}); 

$(document).click(function() { 
     $('.parent').fadeOut("fast"); 
    $(".header").css("background-color","white"); 

}); 

$(".parent").click(function(event){ 
    event.stopPropagation(); 
}); 

http://jsfiddle.net/bmcmahen/X9S5C/8/

Это работает хорошо, пока я не нажмёте за пределами всплывающего меню, чтобы закрыть его, а затем попытаться нажать на кнопку меню еще раз. Затем требуется двойной щелчок. То, что мне нужно сделать, - это оттолкнуть щелчок на div от функции $ (document) .click. Любая идея о том, как я это сделаю?

+1

Я вообще никогда не использовать тумблер, вместо этого я использовать один «нажмите» слушателя и полагаться на текущее состояние «div в вопросах», используя '.is (': hidden')' – anson

+0

Я подумывал о чем-то подобном - я сделаю это. – bento

ответ

0
$(document).on('click', function() { 
    $(".header .parent").not(':hidden').closest('.header').click(); 
}); 

Это закрывает все всплывающие меню, а не только последний один открыт.

Оставьте все остальное как есть. Не нужно использовать .data() или имя класса.

Fiddle

+0

Ах .. это кажется более простым. Благодарю. И да, он закрывает все открытые div. Чтобы перевести это на английский: когда щелкнут документ, он ищет все элементы с классом .parent, которые не скрыты, находит следующий класс .header и нажимает на него. Это вызывает параметр переключения, сбросив его. Это верно? – bento

+0

Да, именно так! –

0

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

Я попытался решить вашу проблему. Вы можете добавить Active класс, который вы нажали, и когда вы нажимаете на документ, то triggeractive header. См. demo here

Просто замените этот код, тогда он должен работать.

$(".header").toggle(function() { 
    $(this).addClass('Active').siblings().removeClass('Active'); 
    $(this).find(".parent").fadeIn("fast"); 
$(this).css("background-color","red");   
}, function() { 
    $(this).find(".parent").fadeOut("fast"); 
$(this).css("background-color","white");  
}); 

$(document).click(function() { 
     //$('.parent').fadeOut("fast"); 
    //$(".header").css("background-color","white"); 
    $(".header.Active").trigger('click'); 

}); 

$(".parent").click(function(event){ 
    event.stopPropagation(); 
}); 

$("#search").keyup(function(){ 
var query = $("#search").val(); 
    $("#results").append(query+"<br>"); 

}); 

+0

Это сделало это. Ницца. Он также удаляет класс у братьев и сестер, делая его более надежным. Благодаря! – bento

+0

Но что делать, если при щелчке документа отображаются два или более всплывающих меню? Конечно, вы хотите, чтобы все они были скрыты. См. Мой ответ. –

0

Вот реализация очень близко к user1193749 годам, но использует jQuery().data() следить за четный/нечетные клики:

http://jsfiddle.net/5E6VP/

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