2012-12-05 47 views
2

我想捕獲所有點擊事件,除非它們是在a-tag上完成的。如何定位除jQuery和CSS之外的所有標籤:not()選擇器

我建立這個小提琴顯示我的問題: http://jsfiddle.net/vwyFg/7/

爲什麼這不是工作?

$('.three').on('click',':not(a)',function(e){ 
    $('body').append('<b>i did not click on a a-tag!</b><br>'); 
    e.preventDefault(); 
    e.stopPropagation(); 
}); 

HTML:

<div class="wrap three"> 
    <div class="wrap two"> 
     <div class="wrap one"> 
      <a href="javascript:$('body').append('i DID click on a a-tag!!<br>');;return false;">klick me!</a> 
     </div> 
    </div> 
</div>​ 
+0

$上( '點擊 '(' 三')。 ':不(一)' 基本上你是在 'A' 標籤跳過click事件,但不停止傳播到會觸發點擊事件的父元素 –

+0

'e.preventDefault'確實阻止了href被執行。 但我仍然不明白:爲什麼不能用':not(...)'過濾傳入事件? 沒有:它不工作,因爲我期望: http://jsfiddle.net/vwyFg/18/ – Benjamin

回答

2

您需要檢查其中的單擊事件orginated:

$('div.three').on('click',function(e){  
    if (e.target.tagName.toLowerCase() == 'a') return; 
    $('body').append('<b>i did not click on a a-tag!</b><br>'); 
    e.preventDefault(); 
    e.stopPropagation(); 
});​ 
+0

不錯的實施。 – KiiroSora09

+1

我想這個問題變成:爲什麼這是必要的?改變':不(a)'到'a'就可以很好地工作(儘管相反)。這似乎是jQuery中的某種錯誤。 – Eric

+0

$('。three')。on('click','*',function(e){更好,這樣你保持委派,你不僅限於DIV元素 –

1

你的代碼改成這樣,注意的安置:不 -

$('.three:not(a)').on('click',function(e){ 
    $('body').append('<b>i did not click on a a-tag!</b><br>'); 
    e.preventDefault(); 
    e.stopPropagation(); 
}); 
+0

這個想法是通過減少事件監聽器的數量來提高腳本性能。 我用你的例子我會用很多聽衆.. – Benjamin

+0

它使用一個監聽器 - 點擊處理程序。你沒有在你原來的帖子中談論過這個,你問你爲什麼做不起作用。 –

+0

這段代碼對問題沒有任何影響 –

1

我加這個代碼:

$(".three a").click(function(e) { 
    e.stopPropagation(); 
});​ 

在這裏看到:JSFiddle

相關問題