IE中的window.event!== window.event

iac*_*ats 13 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 !== 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>
Run Code Online (Sandbox Code Playgroud)

结果:

IE(我已经测试过IE6 - IE8)说:

window === window
window.event !== window.event
Run Code Online (Sandbox Code Playgroud)

所有其他浏览器说:

window === window
window.event === window.event
Run Code Online (Sandbox Code Playgroud)

IE的回应是什么原因?谢谢.

Nat*_*all 7

我做了一些实验.看起来每次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
};
Run Code Online (Sandbox Code Playgroud)

因此,每当您检索时window.event,IE都会创建一个新对象.如果您针对自身(u == uv == v)测试该对象true.如果你针对另一个window.event对象测试它,那就错了.

(请注意,这是不同的行为NaN,如var a = NaN; console.log(a == a);false).

可以把它想象window.event成一个发电机,就像window.createCopyOfLastEvent()在IE中一样. window.event是一个总是返回一个新对象的getter.以下说明了这一点:

document.body.onclick = function() {
    var v = window.event;
    v.a = 1;
    console.log(v.a); // 1
    console.log(window.event.a); // undefined
};
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,window.event.aundefined因为它引用的是一个不同的对象,而不是那个对象a = 1.

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

var weirdObject = Object.create({ }, {
    whoa: {
        get: function() {
            return new Object();
        }
    }
});

console.log(weirdObject.whoa == weirdObject.whoa); // false
Run Code Online (Sandbox Code Playgroud)

或者甚至可能更奇怪的是:

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

console.log(ahh == ahh); // false
Run Code Online (Sandbox Code Playgroud)


Jer*_*her 3

更新:阅读以下内容:IE Bug (window === top) === false

简而言之——IE 被破坏了并且不能很好地比较宿主对象。

并非所有浏览器都支持window.event. 大多数使用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' );   
}
Run Code Online (Sandbox Code Playgroud)

}