Chrome 66.0.3359.117中window['event']异常是Bug还是新规则?
这是Chrome 66开始的有意变更,并非Bug
你观察到的这个现象是Chrome从版本66.0.3359.117开始引入的有意行为调整,不是浏览器Bug,而是针对非标准特性window.event的规范化处理。
背景说明
window.event本身并非标准DOM API,它最早是IE浏览器的私有特性,后来Chrome等浏览器为了兼容旧代码才实现了这个全局属性,但不同浏览器对它的行为实现一直没有统一标准。
Chrome 66的具体变更
在Chrome 66之前(包括你提到的Chrome 65、IE11、Edge),每次触发事件时,浏览器都会强制覆盖window.event的值,不管你之前有没有手动修改过它。比如你即使执行了window.event = undefined,下一次事件触发时,浏览器依然会把当前事件对象赋值给window.event。
但从Chrome 66开始,浏览器调整了这个逻辑:
- 如果你没有手动修改过
window.event,事件触发时浏览器依然会自动填充这个全局属性; - 一旦你主动将
window.event设置为undefined(或其他任意值),后续事件触发时,浏览器就不会再自动给这个全局属性赋值了,它会保持你设置的状态。
这就解释了你的测试场景:
- 首次点击button1,
window.event被浏览器自动赋值为当前点击事件对象,控制台正常打印Event实例; - 点击button2执行
window['event'] = undefined;后,Chrome记住了这个手动修改的状态,再点击button1时就不再自动填充window.event,所以控制台输出undefined。
建议的标准写法
因为window.event是非标准特性,行为差异大,推荐使用标准的事件参数方式获取事件对象,比如:
<button onclick="console.log(event)">button1</button> <!-- 或者更规范的函数写法 --> <button onclick="handleClick(event)">button2</button> <script> function handleClick(e) { console.log(e); // 标准方式获取事件对象,兼容性更好 } </script>
内容的提问来源于stack exchange,提问作者Hyunwoo Hwang
相关产品推荐
相关产品推荐

