2010-06-24 72 views
1

我想弄清楚如何讓用戶在外面點擊時使菜單消失。 我的方法是這樣的:jquery選擇除此之外的任何東西及其後代

$(*).not(menu).bind('click', function() { $(menu).hide() }) 

由於某種原因,這是行不通的。任何想法我可能做錯了什麼? 謝謝

回答

5

$('*'). 

是邪惡的,瘋了,惡業!

改用

$(document.body).bind('click', function(e){ 
    if(e.target.id !== 'yourmenuid' || $(e.target).parents().is('#yourmenuid')) 
     $('#menuid').hide(); 
}); 

儘量避免通用選擇*在任何時候。 Sizzle確實會查詢標記中所有可用的元素,這些元素非常昂貴。

+0

的偉大工程!謝謝你的提示。 – salmane 2010-06-24 14:08:40

+0

這不能工作。 '父母'是一種方法 - 不是一個集合。 – James 2010-06-24 14:10:33

+0

如果你在這裏,條件不應該是'if(目標不在菜單內)「......而是」if(目標在菜單內)「。 – James 2010-06-24 14:12:42

2

這是一個壞主意。

寫入$('*')會將您的點擊處理程序添加到文檔中的每個單個元素,這將會很慢。另外,它不會處理稍後添加的任何新元素的點擊。 (除非他們泡了)

相反,你應該處理click事件的根元素,就像這樣:

$(document).click(function(e) { 
    if (e.target === menu || $(e.target).parents().is(menu)) 
     return; 
    $(menu).hide(); 
}); 

任何元素上的所有click事件最終會冒泡的根元素(除非你取消它),所以這將處理每一次點擊。

+0

'parents'是一種方法 - 不是集合或jQuery對象。 – James 2010-06-24 14:16:21

+0

@ J-P:你說的對;我忘記了括號。 – SLaks 2010-06-24 14:24:00

0

作爲替代方案,您是否考慮過jQuery.hover

$('#menu > ul > li').hover(
    function() { $('ul', this).show(); }, 
    function() { $('ul', this).hide(); } 
); 

在mouseover/mouseout上出現/消失是更常見的做法。你甚至可以使用jQuery.slideDown()jQuery.slideUp()來更順利。

$('#menu > ul > li').hover(
    function() { $('ul', this).slideDown(250); }, 
    function() { $('ul', this).slideUp(100); } 
); 
3

最快和最簡單的方式來做到這一點:

jQuery(document).delegate(':not(#menu-id)', 'click', function(){ 
    $('#menu-id').hide(); 
}); 

或者:

$(document).click(function(){ 
    if (e.target !== menu && !$.contains(e.target, menu)) { 
     $(menu).hide(); 
    } 
}); 
相關問題