Javascript window.event!==IE中的窗口事件

Javascript window.event!==IE中的窗口事件,javascript,internet-explorer,Javascript,Internet Explorer,代码: <html> <head> <script type="text/javascript"> onload = function(){ document.getElementById('btn1').onclick = function(){ if (window === window) alert('window === window') else alert('window

代码:

<html>
<head>
<script type="text/javascript">
  onload = function(){
    document.getElementById('btn1').onclick = function(){   
      if (window === window)  
        alert('window === window')
      else
        alert('window !== window');

      if (window.event === window.event)  
        alert('window.event === window.event')
      else
        alert('window.event !== window.event' );   
    }
  }
</script>
</head>
<body>
<button id="btn1" >click</button>
</body>
</html>
所有其他浏览器都会显示:

window === window
window.event === window.event
IE回应的原因是什么?谢谢。

更新: 请阅读以下内容:

简言之,IE已损坏,无法很好地比较主机对象

并非所有浏览器都支持
window.event
。大多数使用传递给函数的
事件
对象。(
window.event
被认为是IE特有的东西,尽管看起来Chrome已经复制了它。)

试试这个:

 document.getElementById('btn1').onclick = function(event){   
  if (!event) {event = window.event;}

  alert([typeof event, typeof window.event])

  if (window === window)  
    alert('window === window')
  else
    alert('window !== window');

  if (window.event === window.event)  
    alert('window.event === window.event')
  else
    alert('window.event !== window.event' );   
}

}我做了一些实验。在IE中,每次访问
窗口时,似乎都会得到一个新对象:

document.body.onclick = function() {
    var u = window.event, v = window.event;
    console.log(window.event == window.event); // false
    console.log(u == v); // false
    console.log(u == u); // true
    console.log(v == v); // true
    console.log(u == window.event); // false
    console.log(v == window.event); // false
};
因此,无论何时检索
window.event
,IE都会创建一个新对象。如果您针对对象本身测试该对象(
u==u
v==v
),则该对象为
true
。如果您针对另一个
window.event
对象对其进行测试,则为false

(请注意,这与
NaN
不同,因为
var a=NaN;console.log(a==a);
false

window.event
想象成一个生成器,更像IE中的
window.createCopyOfLasteEvent()
。event
是一个始终返回新对象的getter。以下说明了这一点:

document.body.onclick = function() {
    var v = window.event;
    v.a = 1;
    console.log(v.a); // 1
    console.log(window.event.a); // undefined
};
在上面的示例中,
window.event.a
在记录时是
未定义的
,因为它引用的对象与
a=1的对象不同

为了进一步说明,可以在纯JavaScript中重新创建此行为(在支持ES5的浏览器中:IE9或FF、Chrome或Safari的最新版本中):

或者甚至是陌生人:

Object.defineProperty(window, 'ahh', {
    get: function() {
        return Math.random();
    }
});

console.log(ahh == ahh); // false

比较行为是在不支持
窗口.event
的浏览器中执行代码时,我们有效地比较两个未定义的值,返回
true
。在MSIE
窗口上。event
仅仅是一个
MSEventObj
接口,这意味着对它的两个不同调用不会返回同一个对象,它们将进行错误比较

这意味着,
window.event
将永远不会相同,因此比较是毫无意义的。如果要比较事件类型,可以通过强制字符串比较来执行duck类型比较:

//false, you're either comparing undefined values or different objects
console.log(window.event == window.event);

//true, you're either comparing two "undefined" or "[object MSEventObj]" strings
console.log((""+window.event) === (""+window.event));
我不知道有哪种实际情况会要求您执行此特定检查。应通过检查其
类型
属性来确定事件类型:

function doSomething(e) {
  if (!e) var e = window.event;
  alert(e.type);//or whatever
}
请注意,这应该从DOM的一部分脚本执行,而不是从开发人员工具的控制台执行:


可能是
NaN
?还是比赛条件?这是可重复的吗?控制台点记录
窗口的值。事件
几次:请注意,在(至少某些)非IE浏览器的
窗口中,事件可能是
未定义的
undefined===undefined
是真的。啊,谢谢@Blender——我一直忘了Chrome这么做。这并不能解释为什么
window。event
不等于
window.event
@NathanWall——找到了一个解释更多的讨论。更新了我的答案。这似乎是原因,而且这个实验发现了IE在这个问题上的工作原理。这是一些很棒的侦探工作。太糟糕了,我只有一张赞成票。+1但MSIE事件模型似乎和通过文档传播的事件对象不一致。因此,对任何特定当前事件目标上的事件对象的引用应与任何阶段中任何其他当前事件目标上的事件对象相同。
//false, you're either comparing undefined values or different objects
console.log(window.event == window.event);

//true, you're either comparing two "undefined" or "[object MSEventObj]" strings
console.log((""+window.event) === (""+window.event));
function doSomething(e) {
  if (!e) var e = window.event;
  alert(e.type);//or whatever
}