2013-10-13 13 views
13

Böyle bir olay listenr kurdum böylece Tamam ...Parametrelerim neden gönderilen bir etkinliğe geçmiyor?

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

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

Sonra böyle olayı tetikleyen ediyorum:

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

window.dispatchEvent(event); 

sorunun console.log olduğunu ayrıştırma mesajını "blerg!" oturumu açmayı beklerken undefined çıkıyor

Burada olaylarla ilgili olarak yanlış yapıyorum, 'cmd' iletisini etkinliğe nasıl iletebilirim? özel etkinlikleri oluşturmak için

+0

Sen CustomEvent' 'kullanmalıdır: https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/ Events/Creating_and_triggering_events? Redirectlocale = tr-US & redirectslug = Web% 2FGuide% 2FDOM% 2FEvents% 2FCreating_and_triggering_events # Adding_custom_data_.E2.80.93_CustomEvent – ComFreek

+0

@ Qantas94Heavy Yanıtıma bakın. – ComFreek

cevap

41
  1. Event yerine Kullanım CustomEvent.

  2. Verilerinizi bir 'details' nesnesinde belirtin (bkz. Kod).

  3. message aynı zamanda postMessage API için kullanıldığı için olay adını değiştirdim. Chrome'da çalışırken sorun çıkarmadı, ancak kullanmazdım. İşte  

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

(document.createEvent() ve CustomEvent::initCustomEvent() kullanarak) IE> = 9 compatiblity için büyük bir adaptasyon: Sağladığınız bu kodu kullanabilirsiniz

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

Bu harika bir teklif, sadece merak ediyorum, 'detay' denen bir jsonun içinde mi yoksa eklemiş olduğunuz bir şey mi? – Smickie

+1

@Smickie Özel verileriniz 'ayrıntı' anahtarında yaşamak zorunda. Aksi halde işe yaramıyor. (Btw, buna 'json' denir. 'Detay', "anahtar" olarak adlandırılır). – ComFreek

+0

Güzel cevap. Btw, Object Literal, 'typeof ({detail: {cmd:' blerg! '}}) Aradığınız terimdir. Detail' ;-) – LessQuesar

12

IE9/10 Polyfill için Mozilla tarafından:
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; 
})(); 

Ayrıca burada açıklanan fakat yanlış URL ile: https://stackoverflow.com/a/22946340/1736012

+0

Bu, IE11'de de gider –

İlgili konular