2013-09-25 89 views
0
$(document).on('click', 'body:not(.add-to)', function(e){ 
    //$('.tooltip').hide(); 
    console.log('clik'); 
}); 

使用上面,無論我點擊pagem中的console.log顯示clik甚至當我點擊元素.add-to它觸發時,它不應該。jQuery的。對()點擊:不

我弄砸了嗎?

<ul class="user-controls"> 
    <li> 
     <a class="add-to" href="#"> 
      <img src="/assets/img/icons/add-feed.png" class="favicon"> 
      <span>Add</span> 
     </a> 
     <div></div> 
    </li> 
</ul> 
+0

使用該選擇器,您說事件應該在觸發時觸發CK不在身上。add-to,我可以猜測你的標籤上沒有class ='add-to'。 – makmonty

回答

3

的選擇body:not(.add-to)頁面<body>元素相匹配,如果不公開add-to類。它不會匹配它的任何後代。

你可能會尋找:

$(document).on('click', 'body :not(.add-to)', function(e) { 
    console.log('click'); 
}); 

但是在這種情況下,不需要body祖先,而你只需要編寫:

$(document).on('click', ':not(.add-to)', function(e) { 
    console.log('click'); 
}); 

編輯:從標記您已發佈,很明顯,單擊<img><span>元素將觸發處理程序,因爲這些元素都不會自己暴露add-to類。

可以解決此問題通過應用closest()e.target

$(document).on("click", function(e) { 
    if (!$(e.target).closest(".add-to").length) { 
     console.log("click"); 
    } 
}); 

注意,通過:not(.add-to *)on()將有幾乎相同的結果,但並不完全:該選擇不會阻止呼叫從到console.log()如果<a>元素具有文本內容並且該內容被點擊,則被執行。

另一方面,基於closest()的解決方案確實可以防止在這些情況下執行console.log()

+0

這仍然觸發console.log – ngplayground

+0

@Beardy,它不應該,除非事件是由匹配'.add-to'的元素的後代觸發的,但不匹配'.add-to'本身。你可以發佈你的標記樣本和/或在一個簡單的[小提琴](http://jsfiddle.net/)重現問題? –

+0

已編輯我的OP與額外的信息 – ngplayground

0

添加主體之間的空間,以獲得decendents

$(document).on('click', 'body :not(.add-to)', function(e){ 
    //$('.tooltip').hide(); 
    console.log('clik'); 
}); 
0

無需體內有

$(document).on('click', ':not(.add-to)', function(e){ 
    //$('.tooltip').hide(); 
    console.log('clik'); 
}); 

截至目前你告訴該機構不具有類.add-to

0

的因爲您的選擇器匹配所有沒有add-to類的body元素。

你正在嘗試做的是這樣的:

$(document).on('click', 'body > *:not(.add-to)', function(e){ 
    console.log('click'); 
}); 
0

你需要body:not(.add-to)之間的空間,否則,你告訴它排除體內的元素與類add-to

$(document).on('click', 'body :not(.add-to)', function(e){ 
    //$('.tooltip').hide(); 
    console.log('clik'); 
}); 

示例 - http://jsfiddle.net/UF44p/