Chrome似乎在Meteor / Blaze中定义了“事件”变量

时间:2016-11-29 16:54:33

标签: javascript meteor meteor-blaze

我正在使用Chrome进行开发。我刚刚发现了一个错误,其中以下代码段在Chrome中正常运行,但在Firefox中却没有。

Template.myTemplate.events({
  "click input[type=checkbox]"(){
    let context = event.target.dataset.context;
    InspireTheWorldWith.call({context});
  }
});

我完全不相信自己的眼睛,但实际上变量'event'从未在事件函数的参数中分配。然而,这在Chrome中没有任何问题。为了记录,它显然应该是:

Template.myTemplate.events({
  "click input[type=checkbox]"(event, template){
    let context = event.target.dataset.context;
    InspireTheWorldWith.call({context});
  }
});

我想了解更多有关这方面的信息,以便真正理解正在发生的事情,但我很难找到谷歌的approrpate'关键字'。对于。

有什么建议吗?

记录中,我使用的是Meteor 1.4,babel-runtime @ 6.18

1 个答案:

答案 0 :(得分:4)

这与Meteor无关,只是Chrome:Chrome这样做是为了支持最初为Internet Explorer编写的代码;除了将事件传递给处理程序之外,它还将其设置为全局event变量。

Microsoft在IE5中的“新”事件处理(或者是5.5?)使用了全局event对象和attachEvent / removeEvent。然后DOM2出现(在IE6发布之后)并定义了addEventListener / removeEventListener,其中事件处理程序将事件作为参数接收。在微软支持DOM2之前几年(IE9)。

因此,当Chrome即将推出时,他们决定提供全局event对象,以提高与IE特定代码的兼容性。 Mozilla选择不这样做。

你可以在这里看到它 - 在Chrome上运行:

document.getElementById("target").addEventListener("click", function(e) {
  console.log("e === event? ", e === event);
}, false);
<div id="target">Click me</div>

如您所见,全局event对象和处理程序接收的事件对象是同一个对象。