1

在按住空格键的同时通过表单输入选项卡后,Internet Explorer 似乎挂起

为了说明问题,我设置了一个带有 3 个复选框的非常简单的表单。 http://inkistudios.com/tests/checkbox.html

如果您按制表符直到进入复选框输入。尝试按住空格键,就像使用键盘切换复选框一样。但然后在释放空格键之前按 Tab 键切换到另一个复选框。这似乎会导致 Internet Explorer 挂起,您无法拖动窗口,并且单击页面上的任何内容似乎会选中/取消选中您选中的复选框。所以 Internet Explorer 似乎仍在等待第一个复选框上的空格键被释放...我在 Internet Explorer 7、8 和 9 中尝试过这个,似乎都有相同的结果。

我想知道是否有人对此有解决方案。也许一些 javascript 会迫使浏览器释放它所处的状态?

我已经尝试过使用 jquery 使元素不聚焦或将焦点放在另一个元素上,以防发生这种情况,但我尝试过的任何方法似乎都无法解决它。

4

1 回答 1

1

我能够使用两个版本的 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 回答