2013-10-01 38 views
0

我想解決一些困難,有一點問題。.find(someElem)的對面,即。想要省略兒童如果e.target事件處理程序

所以,我想跟蹤頁面上的所有點擊,只做一些事情,如果e.target不是某些元素的孩子。所以我有:

jQuery('body').click(function(e){ 
    // some stuff 
    // do some more stuff 
     if(!(jQuery('#element1, #element2, #element3').find(e.target))){ 
      // do something extra here ONLY if the target is NOT a child 
      // of any of those elements 
     } 

}) 

這似乎沒有工作。我嘗試了一些其他的東西來得到「未發現」的氛圍,ala,.not,!()等等。不能。似乎忽略了整個代碼。即使我做了一個簡單的測試:

 // I expressly click outside this area of element1, still captures it. 
    if(jQuery('#element1').find(e.target)){ 
     console.log('in') 
     e.stopPropagation(); 
    // failes 

回答

4

有幾種方法可以解決這個問題。最小的變化將是追加.length到您的條件:

if(!jQuery('#element1, #element2, #element3').find(e.target).length) { 
    // do something extra here ONLY if the target is NOT a child 
    // of any of those elements 
} 

沒有.length條件將永遠是假的,因爲一個jQuery對象,即使它不換任何DOM元素的truthy值。

一個更好的方法可能是向後做檢查:而不是從目標元素中散開,並且走所有的DOM(這可能意味着要訪問數百個後代),爲什麼不簡單地走目標的父母會是一個更小的數字)呢?

if(!$(e.target).parents().filter('#element1, #element2, #element3').length) { 
    // do stuff 
} 

第三種方法是對你感興趣的元素安裝一個單獨的點擊處理程序,並用它來冒泡到<body>停止單擊事件:

$('#element1, #element2, #element3').click(function(e){ 
    e.stopPropagation(); 
}); 

這樣,你不在原始處理程序中不需要條件語句,但我不希望這樣做,因爲它引入了處理程序之間的「細微」依賴關係,乍一看看起來不相關。

+0

這就是匹配的一個非常緩慢的方式,相對於從點擊目標檢查備份層次結構(即使用父母()或類似)。 –

+0

@TrueBlueAussie:還在編輯,我正在寫那個:) – Jon

+0

我喜歡走父母的路線。只是沒有發生在我身上,非常感謝你! –

2

我想你搜索jQuery.parents(selector)Documentation jQuery

$('body').click(function(e) { 
    if (e.target.parents(<selector>).length == 0) { 
    // Not child of selected parent => do something 
    } 
});