2013-02-22 107 views
2

我添加自定義事件偵聽器修改功能參數

$(document).on('customEvent', function(e, message) { 
    message = 'Hello world'; 
}); 

別的地方我觸發它:

var message = 'no message'; 
$(document).trigger('customEvent', message); 
// I want here message to be `Hello world` 

有沒有什麼辦法讓更新的消息,而不將其分配給一些全局變量?

我想用jQuery創建類似WordPress filter API的東西。

+0

使用自動調用的函數來包裝一切。 – Lucas 2013-02-22 18:20:27

+0

事件可以綁定到任何地方,即使在一個單獨的文件中。 – Marvin3 2013-02-22 18:21:28

回答

5

不是傳遞一個消息字符串,傳遞一個消息對象與消息字符串作爲成員。

$(document).on('customEvent', function(e, messageObj) { 
    messageObj.messageStr= 'Hello world'; 
}); 

var messageObj = {'messageStr':'initial Message'}; 
$(document).trigger('customEvent', messageObj); 

在觸發器中,您更新了對象的messageStr成員。你會有數據。

但是你需要確保你的代碼不是異步的。唯一保險的方法是使用觸發器的回叫。

+0

耶因爲通過引用傳遞的對象:-) – 2013-02-22 18:30:09

+0

它工作正常http://jsfiddle.net/BgXs7/ – r043v 2013-02-22 18:30:47

+0

這真棒,謝謝! – Marvin3 2013-02-22 18:30:49

2

如果你所有的JS代碼可以被組合在一起,那麼你可以使用這個方法:

(function() { 
    $(document).on('customEvent', function(e, message) { 
     sharedMessage = message; 
    }); 
    ... 
    var message = 'no message'; 
    $(document).trigger('customEvent', 'hello, world!'); 
}()); 

由於JavaScript變數函數作用域,該函數內的任何var不會是全球性的。如果沒有,你可以創建自己的,不太可能發生碰撞,命名空間:

var reallyunlikelytocollidenamespace = {}; 
reallyunlikelytocollidenamespace.message = 'no message'; 
... 
+0

這不起作用。在綁定事件中,'message'將是局部變量,而不是「全局」變量。爲了它的工作,你需要在綁定事件之前聲明'var message',並且沒有'message'作爲參數。此外,您需要將您的「名稱空間」聲明爲對象,然後才能分配給它。 'var a; a.test = 123;'不起作用。它需要'var a = {};'。 – 2013-02-22 18:26:12

+0

@RocketHazmat你確實是對的,它從原始帖子剪切/粘貼...更新以顯示我認爲他有什麼意思。是的,還需要對象分配。也更新了。 – Lucas 2013-02-22 18:28:50