2012-12-05 22 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

相关问题