1

スペースバーを押しながらフォーム入力をタブで移動すると、Internet Explorer がハングするように見える

問題を説明するために、3 つのチェックボックスを備えた非常に単純なフォームをセットアップしました。 http://inkistudios.com/tests/checkbox.html

チェックボックスの入力に到達するまでタブを押した場合。キーボードを使用してチェックボックスを切り替えるかのように、スペースバーを押し続けてみてください。スペースバーを放す前に、タブを押して別のチェックボックスに切り替えます。これにより、Internet Explorer がハングしたり、ウィンドウをドラッグしたりできず、ページ上の何かをクリックすると、タブで外したチェックボックスがオン/オフになっているようです。そのため、Internet Explorer は最初のチェックボックスでスペースバーが解放されるのをまだ待っているようです... Internet Explorer 7、8、および 9 でこれを試してみましたが、すべて同じ結果になるようです。

誰かがこれに対する解決策を持っているかどうか疑問に思っていました。おそらく、ブラウザが現在の状態を強制的に解放するJavaScriptですか?

要素のフォーカスを外したり、jquery を使用して別の要素にフォーカスを当てたりしようとしましたが、試したことはありません。

4

1 に答える 1

1

2 つのバージョンの IE を使用して、この動作を再現できました。

  • IE 8 (バージョン 8.0.7601.1754)。
  • IE 9 (バージョン 9.0.8112.16421、更新バージョン 9.0.4)

ウィンドウのタイトル バーをクリックすると、ページ内の任意の場所をクリックできることに加えて、チェックボックスが切り替わりました。スペースをもう一度押すとすぐにウィンドウが解放されることがわかりました。

これは、IE がフォーカスを処理する方法のバグのようです。もう一度スペースを押すとすぐにウィンドウが解放されるので、JavaScript を記述してスペース キーを押すことをシミュレートできるのではないかと考えました。テストケースに基づいて作成したスクリプトは次のとおりです。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="robots" content="none">
    <meta name="viewport" content="width=960">

    <title>checkbox test</title>

</head>
<body>

<h1>Checkbox test</h1>

<input name="item1" id="item1" value="1" checked="checked" type="checkbox" />
<label for="item1">item1</label><br />

<input name="item2" id="item2" value="2" checked="checked" type="checkbox" />
<label for="item2">item2</label><br />

<input name="item3" id="item3" value="3" type="checkbox" />
<label for="item3">item3</label>

<script>
<!--
var spaceDown = false;
var tabDown = false;

window.onload = function(){
    document.onkeydown = function(){
        if(event.keyCode == 32){ spaceDown = true; }
        if(event.keyCode == 9){ tabDown = true; }
    }

    document.onkeyup = function(){
        if(spaceDown && tabDown){
            console.log("Danger, Will Fobinson!");
            console.log("Simulating space bar press ...");
            var e = document.createEventObject();
            e.altKey = false;
            e.ctrlKey = false;
            e.shiftKey = false;
            e.keyCode = 32;

            document.fireEvent("onkeydown", e);
            document.fireEvent("onkeyup", e);
        }

        if(event.keyCode == 32){ spaceDown = false; }
        if(event.keyCode == 9){ tabDown = false; }
    }
}



// -->
</script>

</body>
</html>

残念ながら、IE 8 で危険状態 (チェックボックスにフォーカスし、スペースを押し、タブを押す) をトリガーすると、IE の CPU 使用率が大幅に増加し、次のような小さなダイアログ ボックスが表示されます。

ダイアログ ボックスのメッセージ: 「行: 0 でスタック オーバーフローが発生しました」

ですから、あまり役に立ちません。

そして、お気づきのように、focus() メソッドと blur() メソッドは、このインスタンスでも何の役にも立たないようです。

したがって、基本的には、IE チームにバグとして報告し、修正されることを願うしかありません。あなたが実際にそれをどのように行うのかわかりません。理論的にはhttp://connect.microsoft.com/IEで IE フィードバックを送信できますが、Windows Live ID でログインする必要があります。

それ以外は...まあ、あまり多くの人がバグを引き起こさないことを願いましょう!

于 2012-03-21T15:53:18.243 に答える