Javascript jQuery传播顺序奇怪
我简化了HTML和Javascript HTML结构Javascript jQuery传播顺序奇怪,javascript,jquery,events,propagation,Javascript,Jquery,Events,Propagation,我简化了HTML和Javascript HTML结构 ul -> li -> a javascript文件 var $ul = $('#the-list'); $ul.find('a').click(function(e){ e.stopImmediatePropagation(); console.debug('a'); }); $ul.unbind('click').click(function(){ console.debug('ul'); });
ul -> li -> a
javascript文件
var $ul = $('#the-list');
$ul.find('a').click(function(e){
e.stopImmediatePropagation();
console.debug('a');
});
$ul.unbind('click').click(function(){
console.debug('ul');
});
问题
第一次单击链接时,一切正常。但是在使用$ul.html(newHtml)
更新列表内容并再次运行上面的代码之后,首先调用$ul上的事件
第一次:
什么会导致这种行为?请原谅这个问题的相反结构如果你正在删除你的
ul
的内容,你不应该将事件侦听器绑定到内容上;相反,将单击侦听器绑定到ul
本身,您可以在一个侦听器中侦听ul
及其子对象上的单击事件。这称为事件委派
$ul.click(function (e) {
var $target = $(e.target);
console.log($target);
});
如果您想专门监听ul
及其包含的锚元素上的点击事件,可以使用:
应该为您提供所需的单击事件。我不是100%肯定这一点,因为
.add
可能会改变一些事情,但这是最基本的想法。现在就开始测试。您的代码按预期工作:在IE和其他软件中测试。每次单击列表中的每个链接仅记录“a”
;使用新内容更新列表和重新绑定事件仍然只会导致每次单击时登录“a”
。“ul”
被记录的唯一时间是在锚定标记外发生单击时,这是意料之中的。感谢您的测试,但我实际上知道这一点。这就是为什么我要用我的措辞来回答这个问题。@Znarkus:那么你是在让我们猜测是什么原因导致你的代码不起作用?那么你会怎么问这个问题?@Znarkus:哦,我不知道,也许隔离并发布实际上不起作用的代码。无法使事件目标方法起作用;目标元素是- ,即使我单击了一个。试图添加一个空的点击处理程序,但没有骰子。@Znarkus:对不起,我有点跑题了。你到底对哪些点击感兴趣?
s?我希望一个处理程序用于- ,一个处理程序用于所有,但是如果用户单击一个,则该事件应该发生precedence@Znarkus:您真的永远不会看到来自
的点击-只会看到来自其子项的点击,
及其子项。这就是说,您可以通过只监听
本身上的点击事件来获取所有这些事件,因为对其子对象的点击会冒出气泡。像这样:但在我更新
的内容之前,一切都是正常的,这让我很困惑
$ul.add($ul.find('a')).live('click', function (e) {
console.log(e.target);
});