连接许多具有相同事件名称但名称空间不同的事件

时间:2012-11-27 02:02:45

标签: jquery

假设我有以下设计代码:

function runTriggers() {
    $(document).trigger('mytrigger.ns1');
    $(document).trigger('mytrigger.ns2');
    $(document).trigger('mytrigger.ns3');
    ...
}

如何连接一个事件处理程序以简单地监听mytrigger而不必担心提及将来可能出现的每种类型的命名空间触发器?

tried

$(document).on('mytrigger', doSomething);

但它不起作用。

2 个答案:

答案 0 :(得分:0)

根据documentation for Namespaced Events

$('.class').bind('click.namespace', function(){}); 
$('.class').trigger('click.namespace'); // Will trigger
$('.class').trigger('click');           // Will trigger
$('.class').trigger('click.other');     // Won't trigger

所以你设计的代码肯定不会起作用,但你可以按如下方式改变逻辑:

$(document).on('mytrigger.ns1', doSomething1);
$(document).on('mytrigger.ns2', doSomething2);
$(document).on('mytrigger.ns3', doSomething3);

然后:

function runTriggers() {
    $(document).trigger('mytrigger'); // will trigger all three `doSomething` handlers.
    ...
}

答案 1 :(得分:0)

这是一个让您接近的解决方法。首先,在字符串原型中添加一个方法:

String.prototype.namespaces = function () {
    var eventName = this + ".";
    var args = Array.prototype.slice.call(arguments);
    return eventName + args.join(" " + eventName);
}

然后,您可以使用.namespaces(namespace1, namespace2...)表示法绑定到同一事件的多个名称空间:

$(function () {

   $("#mydiv").on("someevent".namespaces("a","b"), function() {
       alert("hello"); 
    });

   $("#mydiv").trigger("someevent.a");
   $("#mydiv").trigger("someevent.b");     
});

这是jsfiddle