我不确定这是否真的是一个事件冒泡问题。 event.stopPropagation()
无法解决问题。场景是:
li
元素。点击事件将根据点击“clickMe”类的次数执行。以下是代码片段:
HTML:
<div class="clickMe">Click Me 1</div>
<div class="clickMe">Click Me 2</div>
<div class="clickMe">Click Me 3</div>
<ul id="test">
<li><a href="#">Test A</a></li>
<li><a href="#">Test B</a></li>
<li><a href="#">Test C</a></li>
</ul>
JS:
$(function() {
$('.clickMe').live('click', function(e){
//e.stopPropagation()
$('li', $('#test')).live('click',function(e){
//e.stopPropagation()
alert('ouch')
})
})
});
提前感谢您对此问题的任何帮助或解释。
答案 0 :(得分:2)
只要在其中一个“clikMe”<li>
元素上发生“点击”,您就会将另一个点击处理程序添加到<div>
元素中。 jQuery代码维护所有这些处理程序,所以在你点击“clickMe”几次后,有几个处理程序,它们都将被调用。
.live()
方法不是委派事件处理的最佳方式。如果您使用的是新版本的jQuery,或至少使用.on()
,请使用.delegate()
。
答案 1 :(得分:2)
对于clickMe
上的每次点击,您都会将事件附加到#test
这是您的元素
live为现在和将来与选择器匹配的所有元素附加事件处理程序。
将两者分开并使用on
$('.clickMe').on('click', function(e) {
//e.stopPropagation()
})
$('li', $('#test')).on('click', function(e) {
//e.stopPropagation()
alert('ouch');
});
答案 2 :(得分:1)
小提琴:
http://jsfiddle.net/iambriansreed/aEkNa/
jQuery的:
$(function() {
var clickme_clicks = 0, clickme_timeout = setTimeout(function(){},0) ;
$('.clickMe').on('click', function(e){
clickme_clicks++;
clearTimeout( clickme_timeout );
clickme_timeout = setTimeout(function(){ clickme_clicks = 0; },1000);
});
$('li a', $('#test')).on('click',function(e){
e.preventDefault();
//if(clickme_clicks == 0) return;
alert('clicks: ' + clickme_clicks );
})
});