2010-02-23 206 views
4

我有一個用於過濾的div,我希望它在點擊div之外的任何東西時關閉。 我試圖構建的選擇器基本上選擇除特定元素以外的所有元素並排除其子元素。 這是我曾經嘗試過,但一直沒能得到工作帶有元素和元素子元素的jQuery選擇器

$('*:not(:has(.exclude *))').live('click', function() {HideFilter();}); 

頁面結構簡化爲這樣的:

<div></div> 
<div> 
<div></div> 
<div> 
    <div class="exclude"><inputs></div> 
</div> 
<div></div> 
</div> 

,所以我希望所有的div的,但是一和所有的東西都不包含事件。 我一直在這一段時間,我需要一些幫助。

回答

4

您是否嘗試過

$('*:not(.exclude, .exclude *)').live(...) 

? [編輯[我看到了 - 問題是,即使排除這些東西,事件仍然會起泡。

嘗試這樣:

$('*').live('click', function(e) { 
    if (!$(e.target).is('.exclude, .exclude *')) 
    // do interesting stuff 
    } 
    return false; 
}); 

這應該停止在被拒絕的事情事件傳播,而無需實際做任何事情。

示例頁面:http://gutfullofbeer.net/balloon.html

編輯更新,3年後:在.live()方法是在這一點上長期棄用。最後一個例子應該看起來像這樣在新的代碼:

$('body').on('click', '*', function(e) { 
    if (!$(e.target).closest('.exclude').length) { 
    // do interesting stuff 
    } 
    return false; 
}); 
+0

我已經嘗試過這一點,它仍然把事件放在.exclude – zeal 2010-02-23 21:42:16

+0

的所有chlidren上。你確定鍵入了它嗎? – Pointy 2010-02-23 21:45:45

+0

是的。調試我的代碼我注意到選擇器正常工作。它僅將事件應用於正確的元素。但我的div下的元素也必須撿起點擊。 – zeal 2010-02-23 21:54:15

0

怎麼樣一個稍微不同的策略:

什麼,但在div被點擊時關閉一切:

$("body").click(function(e){ 
    if($(e.target).hasClass("exclude")){ 
    //show stuff 
    } else { 
    //hide stuff 
    } 
}); 

類似的東西

+0

這將有助於如果我不能讓我的選擇器工作。謝謝。 – zeal 2010-02-23 21:52:26