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的回应是什么原因?谢谢.
我做了一些实验.看起来每次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 == u或v == 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.a是undefined因为它引用的是一个不同的对象,而不是那个对象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)
更新:阅读以下内容: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)
}