2012-11-27 72 views
1

比方說,我有以下做作代碼:線向上具有相同的事件名稱但不同的命名空間中的許多事件

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

我怎樣才能線了一個事件處理程序來監聽根本mytrigger,而不必擔心關於提及將來可能出現的每種類型的名稱空間觸發器?

我已經tried

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

,但它不工作。

回答

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. 
    ... 
} 
+0

我想爲許多觸發器做一個事件處理程序,而不是一個觸發器。 – Jason

+0

在這種情況下,您似乎正在描述事件不是名稱空間的簡單情況,'$(document).on('myEvent',doSomething);',並且使用$(document).trigger(' myEvent')'。有一件事是肯定的,你不能觸發不存在的命名空間事件! –

+0

不,我正在試圖做我在這個例子中做的事情。基本上我有很多觸發命名空間「綁定」自定義事件的對象。我有一個主對象,每次調用'bound'事件時都會作出反應,但我只想做'.on('bound',handleBound)'而不是'.on('bound.xyz bound.abc bound.efg bound.etc',handleBound)' – Jason

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

+0

聰明,但我很確定我會被拖入街頭,並修改'String'原型 – Jason

+1

@Jason lol - 使語法看起來不錯,但您可能會更安全,使它成爲本地實用函數:p –

相關問題