2013-10-13 65 views
13

好了,所以我已經設置了一個事件listenr這樣的...爲什麼我的參數不能傳遞給派發事件?

window.addEventListener('message', parseMessage, false); 

var parseMessage = function(rawMessage) { 
    console.log(rawMessage.cmd); 
}; 

然後我觸發這樣的事件:

var event = new Event('message', {'cmd':"blerg!"}); 

window.dispatchEvent(event); 

的問題是在執行console.log當我期望註銷「blerg!」時,解析消息將被註銷。

我在做什麼我在做錯了事件,如何將'cmd'消息傳遞給事件?

+0

你應該使用'CustomEvent':https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/ Events/Creating_and_triggering_events?redirectlocale = en-US&redirectslug = Web%2FGuide%2FDOM%2FEvents%2FCreating_and_triggering_events#Adding_custom_data_.E2.80.93_CustomEvent – ComFreek

+0

@ Qantas94Heavy請參閱我的答案。 – ComFreek

回答

41
  1. 使用CustomEventEvent代替用於創建自定義事件。

  2. 在「詳細信息」對象中指定您的數據(請參閱代碼)。

  3. 我更改了事件名稱,因爲message也用於postMessage API。在Chrome中運行時不會造成問題,但我不會使用它。

 

var parseMessage = function(rawMessage) { 
    console.log(rawMessage); 
    console.log(rawMessage.detail.cmd); 
}; 

// changed event name 
window.addEventListener('myMessage', parseMessage, false); 

// data should be in a 'details' object 
var evt = new CustomEvent('myMessage', { 
    detail: { 
     'cmd' : "blerg!" 
    } 
}); 

window.dispatchEvent(evt); 

這裏是IE> = 9的兼容性的調整(使用document.createEvent()CustomEvent::initCustomEvent()):

var evt = document.createEvent("CustomEvent"); 
evt.initCustomEvent('myMessage', false, false, { 
    'cmd': "blerg!" 
}); 
+0

這真是太棒了,謝謝,只是想知道,它必須在一個叫做'detail'的json裏面,還是你添加的東西? – Smickie

+1

@Smickie你的自定義數據必須存在於'detail'鍵中。否則不起作用。 (順便說一句,它不叫'json','detail'是所謂的「鍵」)。 – ComFreek

+0

不錯的答案。順便說一下,對象文字是您尋找的術語'typeof({detail:{cmd:'blerg!'}})。detail' ;-) – LessQuesar

12

對於IE9/10填充工具可以使用提供此代碼通過Mozilla:
https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent

(function() { 
    function CustomEvent (event, params) { 
    params = params || { bubbles: false, cancelable: false, detail: undefined }; 
    var evt = document.createEvent('CustomEvent'); 
    evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); 
    return evt; 
    } 

    CustomEvent.prototype = window.Event.prototype; 

    window.CustomEvent = CustomEvent; 
})(); 

這裏還描述但錯誤的URL: https://stackoverflow.com/a/22946340/1736012

+0

這也修復了它在IE11 –

相關問題