我正在使用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
答案 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
对象和处理程序接收的事件对象是同一个对象。