Internet Explorer зависает при удерживании в пространстве и переходе через форму - PullRequest
1 голос
/ 17 февраля 2012

Internet Explorer, кажется, зависает после того, как вы нажимаете вкладку формы, удерживая клавишу пробела

, чтобы проиллюстрировать проблему, я установил действительно простую форму с 3 флажками. http://inkistudios.com/tests/checkbox.html

если вы нажимаете вкладку, пока не доберетесь до ввода флажка. попробуйте удерживать клавишу пробела, как если бы вы переключали флажок с помощью клавиатуры. но затем нажмите Tab, чтобы переключиться на другой флажок, прежде чем отпустить пробел. кажется, что это приводит к зависанию Internet Explorer, вы не можете перетаскивать окно, и если щелкнуть что-либо на странице, кажется, снимите / снимите флажок, из которого вы сделали вкладку. так что Internet Explorer, похоже, все еще ждет выхода пробела при первом флажке ... Я пробовал это в Internet Explorer 7, 8 и 9, все, кажется, имеют тот же результат.

Мне было интересно, есть ли у кого-нибудь решение для этого. может быть какой-нибудь javascript, который заставит браузер освободить состояние, в котором он находится?

Я уже пытался расфокусировать элемент или фокусироваться на другом элементе, используя jquery на случай, если это произойдет, но, похоже, ничто из того, что я пробовал, не решает проблему.

1 Ответ

1 голос
/ 21 марта 2012

Мне удалось воспроизвести это поведение, используя две версии 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 и выдает маленькое диалоговое окно с надписью:

Dialog box saying: 'stack overflow at line: 0'

Так что это не очень полезно.

И, как вы обнаружили, методы focus () и blur (), похоже, тоже не помогают в этом случае.

Так что, в принципе, я думаю, что ваш единственный вариант - сообщить об этом как об ошибке команде IE, и надеюсь, что они исправят это. Я не уверен, как ты это делаешь на самом деле. Теоретически вы можете отправить отзыв IE в http://connect.microsoft.com/IE - но вам нужно будет войти с Windows Live ID, и я не уверен, как вы получите один из них.

Кроме этого ... давайте просто надеяться, что не слишком много людей вызовут ошибку!

...