HTML:
<div class="parent">
<div class="child1" >
</div>
<div class="child2">
</div>
</div>
<a class="btn1">customClick.btn1</a>
<a class="btn2">customClick.btn2</a>
JavaScript:
jQuery('div.child1')
.bind('customClick.btn1', function () {
alert('child1 reacted to customClick.btn1');
});
jQuery('div.child2')
.bind('customClick.btn2', function () {
alert('child2 reacted to customClick.btn2');
});
jQuery('div.parent')
.bind('customClick.btn1', function (e) {
alert('parent reacted to customClick.btn1');
})
.bind('customClick.btn2', function (e) {
alert('parent reacted to customClick.btn2');
});
jQuery('a.btn1')
.click(function(){
jQuery('div.child1').trigger('customClick.btn1');
});
jQuery('a.btn2')
.click(function(){
jQuery('div.child2').trigger('customClick.btn2');
});
当我按预期单击
a.btn1
时,customClick.btn1
事件由div.child1
而不是div.child2
处理。出乎意料的是,customClick
事件冒泡并触发div.parent
和customClick.btn1
的customClick.btn2
处理程序。这是正确的吗?有什么办法可以使自定义事件在其命名空间中冒泡吗?换句话说,当触发customClick.btn1
时,不会处理customClick
的所有父处理程序,只会处理那些处理customClick.btn1
的父处理程序。 最佳答案
查看文档时,看起来好像在进行命名空间设置时,.
之前的部分是事件类型。这就是被触发的事件。
因此,.parent
元素绑定了2个customClick
事件类型。这就是为什么他们都开枪的原因。
从文档中:http://api.jquery.com/bind/
如果eventType字符串包含一个句点(。)字符,则该事件具有名称空间。句点字符将事件与其名称空间分开。例如,在调用.bind('click.name',handler)中,字符串click是事件类型,字符串名称是名称空间。使用命名空间,我们可以取消绑定或触发某种类型的事件而不会影响其他事件。
在事件冒泡时会考虑使用名称空间似乎是合理的期望,但显然不会。
您可以改为查看e.target.className
来查看触发了哪个元素。还必须有一种方法可以获取事件对象测试的命名空间。
编辑:
看起来您可以像这样测试事件对象的名称空间:
if(e.handleObj.namespace === 'btn1')
编辑:
就像@Nick Craver在下面的注释中演示的那样,当名称空间事件未绑定到子级时,在冒泡中考虑该名称空间。这样(一种方式或另一种方式)似乎是一个错误。
无论哪种方式,您都应该能够如上所述测试名称空间,因为在两种情况下,该属性似乎都存在于Event对象中。
关于jquery - jQuery namespace 不会冒泡哪个自定义事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3497832/