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.parentcustomClick.btn1customClick.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/

10-09 18:21
查看更多