13
4

3 に答える 3

7

私はいくつかの実験をしました。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.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

または、見知らぬ人に見えるかもしれません:

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

console.log(ahh == ahh); // false
于 2012-09-18T02:59:35.467 に答える
3

更新:これを読んでください:IEバグ(ウィンドウ===トップ)=== false

つまり、IEは壊れており、ホストオブジェクトをうまく比較できません。

すべてのブラウザがをサポートしているわけではありませんwindow.event。ほとんどの場合event、関数に渡されたオブジェクトを使用します。(window.eventChromeがそれをコピーしたように見えますが、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' );   
}

}

于 2012-09-18T02:26:48.213 に答える
3

比較動作は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 の一部であるスクリプトから実行する必要があることに注意してください。

しないでください

クロスブラウザー イベント プロパティの癖の概要

于 2012-09-18T03:18:34.740 に答える