1

HTTP を使用して LAN 内で正常に動作する Web アプリに取り組んでいますが、SSL 経由でリモートでテストすると、IE (7 & 8) で失敗します。Firefox、Camino、Safari はすべて問題なく動作します。

key問題が未定義であることを突き止めました。関連するコードは次のとおりです。

function showResult(e,str,num) {
    var key = (window.Event) ? e.which : e.keyCode;

    if(((key > 32 && key < 58) || (key > 64 && key < 91) || (key > 95 && key < 123)) && (str.length >= num)) {

keySSL 経由の IE では定義されていないが、HTTP 経由では正常に動作する理由についての手がかりはありますか? さらに良いことに、誰かがこの問題を克服する方法を教えてもらえますか? FWIW、バージョン 7 より前の IE をサポートする必要はありません。

アップデート:

交換を提案する回答がありました

var key = (window.event) ? e.which : e.keyCode;

var key;
e = e || window.event;
key = e.keyCode || e.which;

それはうまくいきます。今の問題は、その回答が削除されたため、その回答を受け入れることができないことです。

4

2 に答える 2

1

わかりました、それは私のものではありませんでしたが、その答えを再度追加し、途中でいくつかの情報を追加します。

したがって、推奨されるコードは次のとおりです。

var key;
e = e || window.event;
key = e.keyCode || e.which;

何をし||ますか?1 つは論理 or 演算子で、辺の 1 つがブール値 true と評価された場合に true を返します。

また、JS では別の用途があります。2 つの引数を指定し、最初の引数が未定義の場合、2 番目の引数が返されます。つまり、上記のコードでは、eが定義されていない場合、 window.eventIE の従来のイベント オブジェクトを代わりに取得します。

e.keyCode || e.which存在するものを使用しても同じことが言えます。そのため、最終的には、さまざまなブラウザーで有効なキー コードになる可能性があります。不思議の国ではすべてがうまくいっています。

しかし、待ってください。あなたの元のコードは似たようなことをしていませんか?

var key = (window.Event) ? e.which : e.keyCode;

うん。あれは何でしょう?JavaScript では大文字と小文字が区別されるため、上記のコードと window.Event異なります。は、発生したイベントに関する情報を取得するために使用する IE の従来のイベント オブジェクトですが、(最初の大文字からわかります) はコンストラクター、またはより具体的にはこの場合は interfaceです。window.eventwindow.eventwindow.Event

ポイントは、そのコードで Mozilla を検出するために使用されたということです。存在する場合は、e.which(Mozilla がキー コードを保存する場所の 1 つ) を選択します。そうでない場合はe.keyCode、IE がキー コードを保存する場所を選択します。

window.Eventただし、これは、IE にはコンストラクターが定義されていないという誤った仮定に基づいています。少なくともIE8の時点で定義されています。これは、新しいバージョンの IE ではe.whichが選択されていることを意味します。IE でサポートされることはありません。そのため、未定義になってしまいます。e.keyCodee.whichkey

しかし、ええと、暗号化された接続と暗号化されていない接続でなぜ違いがあるのでしょうか? それは良い質問です。開発環境にアクセスせずに確実に知ることはできませんが、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 は生意気なサルになります。

結論: 新しいコードを使用してください。

于 2011-04-12T12:25:10.170 に答える
0

おそらく、(https ではなく) http 経由でスクリプトを含めた可能性があります。ページ自体は安全で、含まれているファイルは安全でないため、読み込みに失敗します。

于 2011-04-11T23:54:47.123 に答える