当在空间中保持并通过表单进行Tab键时,Internet Explorer会挂起

时间:2012-02-16 23:54:06

标签: internet-explorer accessibility hang tabbing

当您在空格键中按住表单输入时,Internet Explorer似乎挂起了

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

如果您按Tab键直到进入复选框输入。 尝试按住空格键,就好像您要使用键盘切换复选框一样。 但是在释放空格键之前按Tab键切换到另一个复选框。 这似乎导致Internet Explorer挂起,你无法拖动窗口,点击页面上的任何内容似乎检查/取消选中您选中的复选框。 所以Internet Explorer似乎还在等待第一个复选框上的空格键发布... 我在Internet Explorer 7,8和9中尝试了这一点,似乎都有相同的结果。

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

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

1 个答案:

答案 0 :(得分: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使用率并弹出一个小对话框,说:

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

所以这不是很有用。

正如您所发现的那样,focus()和blur()方法在这个实例中似乎没有任何帮助。

所以基本上,我认为你唯一的选择是将它作为一个错误报告给IE团队,并希望他们修复它。我不确定你是怎么做的。从理论上讲,您可以在http://connect.microsoft.com/IE提交IE反馈 - 但您需要使用Windows Live ID登录,而且我不确定您是如何获得其中一个的。

除此之外......好吧,我们只希望没有太多人触发这个错误!