2013-10-13 25 views
13

Ok così ho creato un listenr evento come questo ...Perché i miei parametri non vengono passati a un evento inviato?

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

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

E poi sto attivando l'evento come questo:

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

window.dispatchEvent(event); 

Il problema è il console.log in il messaggio di analisi si disconnette indefinito quando mi aspetto di disconnettere "blerg!"

Cosa sto facendo di sbagliato qui con gli eventi, come passare il messaggio "cmd" all'evento?

+0

si dovrebbe usare 'CustomEvent': https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/ Eventi/Creating_and_triggering_events? Redirectlocale = en-US e redirectslug = Web% 2FGuide% 2FDOM% 2FEvents% 2FCreating_and_triggering_events # Adding_custom_data_.E2.80.93_CustomEvent – ComFreek

+0

@ Qantas94Heavy Vedere la mia risposta. – ComFreek

risposta

41
  1. Usa CustomEventinvece di Event per la creazione di eventi personalizzati.

  2. Specificare i dati in un oggetto "dettagli" (vedere codice).

  3. Ho cambiato il nome dell'evento perché message viene utilizzato anche per postMessage API. Non ha causato problemi durante l'esecuzione in Chrome, ma non lo userei.

 

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); 

Ecco un adeguamento per IE> = 9 compatibilità (utilizzando document.createEvent() e CustomEvent::initCustomEvent()):

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

Questo è un ringraziamento brillante, mi chiedo solo, deve essere all'interno di un json chiamato 'dettaglio' o è qualcosa che hai aggiunto? – Smickie

+1

@Smickie I dati personalizzati devono vivere nella chiave "dettagli". Altrimenti non funziona. (A proposito, non è chiamato "json". "Detail" è una cosiddetta "chiave"). – ComFreek

+0

Bella risposta. Btw, Object Literal è il termine che stai cercando 'typeof ({detail: {cmd: 'blerg!'}}. Detail' ;-) – LessQuesar

12

Per IE9/10 polyfill è possibile utilizzare questo codice fornito di 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; 
})(); 

anche descritto qui, ma con l'URL sbagliato: https://stackoverflow.com/a/22946340/1736012

+0

Questo lo risolve anche in IE11 –