3 に答える
私はいくつかの実験をしました。IE でアクセスするたびwindow.event
に、新しいオブジェクトを取得するように見えます。
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
ジェネレーターのようなもの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
};
上記の例で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
または、見知らぬ人に見えるかもしれません:
Object.defineProperty(window, 'ahh', {
get: function() {
return Math.random();
}
});
console.log(ahh == ahh); // false
更新:これを読んでください:IEバグ(ウィンドウ===トップ)=== false
つまり、IEは壊れており、ホストオブジェクトをうまく比較できません。
すべてのブラウザがをサポートしているわけではありませんwindow.event
。ほとんどの場合event
、関数に渡されたオブジェクトを使用します。(window.event
Chromeがそれをコピーしたように見えますが、IE固有のものと見なされていました。)
これを試して:
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' );
}
}
比較動作はECMAScript に準拠しています コードが をサポートしていないブラウザで実行されると、window.event
を返す 2 つの未定義の値を効果的に比較していますtrue
。MSIEwindow.event
は単なるMSEventObj
インターフェイスです。つまり、MSIE への 2 つの異なる呼び出しは同じオブジェクトを返さず、誤って比較されます。
つまりwindow.event
、同じになることは決してないので、比較は無意味です。イベント タイプを比較しようとしている場合は、文字列比較を強制することでダック タイプ比較を行うことができます。
//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));
この特定のチェックを実行する必要がある実際のシナリオについては知りません。イベント タイプの決定は、そのtype
プロパティを確認することによって行う必要があります。
function doSomething(e) {
if (!e) var e = window.event;
alert(e.type);//or whatever
}
これは、開発者ツールのコンソールからではなく、DOM の一部であるスクリプトから実行する必要があることに注意してください。