【问题标题】:Why aren't my parameters getting passed through to a dispatched event?为什么我的参数没有传递给已调度的事件?
【发布时间】:2013-10-13 12:45:15
【问题描述】:

我已经设置了一个这样的事件监听器......

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

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

然后我像这样触发事件:

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

window.dispatchEvent(event);

问题是当我期望注销“blerg!”时,解析消息中的 console.log 正在注销未定义

我在这里对事件做错了什么,如何将“cmd”消息传递给事件?

【问题讨论】:

标签: javascript events dom-events addeventlistener


【解决方案1】:
  1. 使用CustomEvent 代替 Event 创建自定义事件。

  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!"
});

【讨论】:

  • 非常感谢,只是想知道,它必须在一个名为“detail”的 json 中还是您添加的内容?
  • @Smickie 您的自定义数据必须位于“详细信息”键中。否则它不起作用。 (顺便说一句,它不称为 'json'。'detail' 是所谓的“键”)。
  • 不错的答案。顺便说一句,Object Literal 是您正在寻找的术语 typeof ({detail:{cmd:'blerg!'}}).detail ;-)
  • 可能值得补充的是,您可以使用 Modernizr 来检测是否支持 CustomEvent,然后您可以选择使用哪种方法来创建您的事件。
  • 在@olefrank 的回答中查看 MDN Polyfill
【解决方案2】:

对于 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;
})();

此处也有描述,但 URL 错误: https://stackoverflow.com/a/22946340/1736012

【讨论】:

  • 这也在 IE11 中修复了它
  • 它不仅修复了 IE9/10,还修复了 IE11 ;)
  • 感谢您的修复
  • 我还必须为 IE11 添加行 window.Event = CustomEvent;,以允许支持像 new Event("myEvent") 这样的代码
猜你喜欢
  • 2020-01-16
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多