わかりました、それは私のものではありませんでしたが、その答えを再度追加し、途中でいくつかの情報を追加します。
したがって、推奨されるコードは次のとおりです。
var key;
e = e || window.event;
key = e.keyCode || e.which;
何をし||
ますか?1 つは論理 or 演算子で、辺の 1 つがブール値 true と評価された場合に true を返します。
また、JS では別の用途があります。2 つの引数を指定し、最初の引数が未定義の場合、2 番目の引数が返されます。つまり、上記のコードでは、e
が定義されていない場合、 window.event
IE の従来のイベント オブジェクトを代わりに取得します。
e.keyCode || e.which
存在するものを使用しても同じことが言えます。そのため、最終的には、さまざまなブラウザーで有効なキー コードになる可能性があります。不思議の国ではすべてがうまくいっています。
しかし、待ってください。あなたの元のコードは似たようなことをしていませんか?
var key = (window.Event) ? e.which : e.keyCode;
うん。あれは何でしょう?JavaScript では大文字と小文字が区別されるため、上記のコードと window.Event
は異なります。は、発生したイベントに関する情報を取得するために使用する IE の従来のイベント オブジェクトですが、(最初の大文字からわかります) はコンストラクター、またはより具体的にはこの場合は interfaceです。window.event
window.event
window.Event
ポイントは、そのコードで Mozilla を検出するために使用されたということです。存在する場合は、e.which
(Mozilla がキー コードを保存する場所の 1 つ) を選択します。そうでない場合はe.keyCode
、IE がキー コードを保存する場所を選択します。
window.Event
ただし、これは、IE にはコンストラクターが定義されていないという誤った仮定に基づいています。少なくともIE8の時点で定義されています。これは、新しいバージョンの IE ではe.which
が選択されていることを意味します。IE でサポートされることはありません。そのため、未定義になってしまいます。e.keyCode
e.which
key
しかし、ええと、暗号化された接続と暗号化されていない接続でなぜ違いがあるのでしょうか? それは良い質問です。開発環境にアクセスせずに確実に知ることはできませんが、IE の互換モードに何かがあると思います。
IE は歴史的に (過去 10 年間)、最も風変わりで非標準的なブラウザーでした。これにより、人々は、a) IE の標準に従って無知にプログラミングし、b) IE の動作の回避策を作成するようになりました。MS が IE を標準に準拠させただけなら、IE の風変わりな動作に何らかの形で依存している多くのページが機能しなくなるでしょう。Microsoft は、IE8+ で古いバージョンの IE をエミュレートすることでこれを認め、別段の指示がない限り、ページが壊れないようにしています。
window.Event
何らかの理由で、テスト環境では、コンストラクター/インターフェースが定義されていない可能性のある「IE7」モードでページが実行されるとしか思えません。これにより、古いコードを使用できますが、問題e.keyCode
ありません。次に、おそらく本番環境で、または暗号化された接続のために(MSが何をしているのかを知っているのはghawdだけです)、より新しいIEモードになり、window.Event
実際に定義されe.which
て選択されます。これにより、IE は生意気なサルになります。
結論: 新しいコードを使用してください。