【问题标题】:Namespaced Custom Events Trigger命名空间自定义事件触发器
【发布时间】:2011-06-10 18:28:17
【问题描述】:

我对命名空间自定义事件应该如何在 jQuery 中工作感到困惑。我从the doc 得到的印象是,触发命名空间自定义事件只会触发专门绑定到该事件的处理程序。相反,似乎命名空间几乎被忽略了。下面的示例和此处的实时代码:http://jsfiddle.net/kZCBw/1/

    $(document)
        .bind("reset.one", function(){ console.log("reset.one event detected");})
        .bind("reset.two", function(){ console.log("reset.two event detected");})
        .bind("cheese", function(){ console.log("cheese event detected");});

        $("#btn1").click(function(){
            console.log("firing reset.one event");
            $(this).trigger("reset.one");
        });
        $("#btn2").click(function(){
            console.log("firing reset.two event");
            $(this).trigger("reset.two");
        });
        $("#btn3").click(function(){
            console.log("firing reset event");
            $(this).trigger("reset");
        });

        //btn1 click should only trigger handlers bound to "reset.one"
        //and yet it triggers anything starting w/ "reset"

我错过了什么?

提前致谢! -马特

【问题讨论】:

  • 旁注:与 jQuery 2.1.4 和 jQuery 3.0 配合得很好

标签: jquery


【解决方案1】:

我至少可以证实你的例子并添加一个观察结果。

如果您将按钮设为监听器(请参阅 http://jsfiddle.net/kZCBw/2/),更好地反映文档中的示例代码,它会按预期工作。

但如果你将它移到 DOM 树中更高的位置(参见 http://jsfiddle.net/kZCBw/3/),它就会失败。

起初,我怀疑这是因为命名空间没有被事件对象冒泡,但我附加了以下代码(http://jsfiddle.net/kZCBw/4/ 的实时示例):

$('*').bind('reset', function(e){
    console.log(e.type + '.' + e.namespace + ' detected at ' + e.currentTarget);
});

如您所见,命名空间正在冒泡。

虽然您正在寻找的行为(命名空间在更高级别的 DOM 节点上保持有效)没有在 documentation 中明确举例说明,但我认为它应该是命名空间事件的工作方式。至此,您现在可以开始寻找“错误或功能”了。

在不接触 jQuery 源代码的情况下完成您正在寻找的事情的一种临时方法是在事件处理程序中使用 EventObject 过滤事件(我怀疑这是首先在 jQuery 中完成命名空间事件的方式) .

【讨论】:

  • +1 对于一个很好的答案。请注意,要测试的适当属性是 e.namespace
  • 感谢 lonesomeday 的客气话和有用的建议。 OP 说明:您可以在jQuery documentation 中获得有关如何使用 EventObject 的指南。或者,只需输入 console.log(e),其中 e 已分配给 EventObject 实例,即可让您快速了解该对象并帮助您了解如何使用它。
  • 感谢 Steven 和 lonesomeday。经过更多的挖掘,事实证明这是一个已知问题。请参阅:bugs.jquery.com/ticket/6913 所以,是的,看来今天唯一的选择是测试命名空间/类名
  • 对于后代,这现在已在 jQuery 1.6 中修复 - 请参阅此处 jsfiddle.net/kZCBw/7
  • Namespacing 在 jQuery 1.7.2 中似乎仍然被破坏,至少在触发如下事件时: $.event.trigger('update.global.options');据我所知,它将触发所有附加到“更新”的元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2012-11-21
  • 2019-06-23
  • 1970-01-01
相关资源
最近更新 更多