Min*_*ure 19 javascript events javascript-events addeventlistener
好的,我已经设置了这样的事件监听器......
window.addEventListener('message', parseMessage, false);
var parseMessage = function(rawMessage) {
console.log(rawMessage.cmd);
};
Run Code Online (Sandbox Code Playgroud)
然后我就像这样触发事件:
var event = new Event('message', {'cmd':"blerg!"});
window.dispatchEvent(event);
Run Code Online (Sandbox Code Playgroud)
问题是当我希望注销"blerg!"时,解析消息中的console.log正在注销未定义.
我在这里做错了什么事情,如何将'cmd'消息传递给事件?
Com*_*eek 48
使用替代的用于创建自定义事件.CustomEvent Event
在"详细信息"对象中指定数据(请参阅代码).
我更改了事件名称,因为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);
Run Code Online (Sandbox Code Playgroud)
这是IE> = 9 compatibleblity(使用document.createEvent()和CustomEvent::initCustomEvent())的调整:
var evt = document.createEvent("CustomEvent");
evt.initCustomEvent('myMessage', false, false, {
'cmd': "blerg!"
});
Run Code Online (Sandbox Code Playgroud)
ole*_*ank 26
对于IE9/10 polyfill,您可以使用Mozilla提供的代码:https:
//developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent
(function () {
if (
typeof window.CustomEvent === "function" ||
// In Safari, typeof CustomEvent == 'object' but it otherwise works fine
this.CustomEvent.toString().indexOf('CustomEventConstructor')>-1
) { return; }
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;
})();
Run Code Online (Sandbox Code Playgroud)
此处还描述了URL错误:https: //stackoverflow.com/a/22946340/1736012