javascript - 在 Firefox 中,在 keydown 事件处理程序中更改焦点会自动单击已聚焦的内容。我该如何防止这种情况?

标签 javascript jquery html firefox

代码如下:http://jsfiddle.net/cPrSZ/2/

HTML

<p>Space changes focus to button</p>
<button id="b1">Button1</button>

JavaScript

var stopProp = function(event) {
    event.stopPropagation()
    event.preventDefault()
    return false;
};

$("#b1").on("click", function(event) {
    alert("Button1 Clicked");
    return stopProp(event);
});

$("body").on("keydown", function(event) {
    if (event.which === 32) {
        $("#b1").focus();
    }
    return stopProp(event);
});

在 Firefox 中,单击该段落以使按钮失去焦点。接下来,按空格键,您将看到按钮单击被触发,即使我的代码没有说这样做。为什么会发生这种情况?

如果我将处理程序附加到 $("p").on("keydown", 而不是 body 上,事情似乎工作正常,但我试图避免为每个可点击元素编写一个处理程序。如果我附加一个“keyup”而不是“keypress”,事情也会正常工作。但我正在制作一个 html5 游戏,我希望能够对按键使用react为了响应性而使用 keyup。

最佳答案

我认为您不需要将 keydown 处理程序更改为 keyup 处理程序。原因如下:

Firefox 似乎将 keyup 事件的组合解释为将焦点应用为与单击相同的东西。我能够克服this fiddle中的问题使用以下代码:

$("body").on("keyup", function (event) {
    if (event.target === document.getElementById('b1')) {
      return stopProp(event); 
    }
});

在这种情况下,每当有按键时,我们都会检查它是否发生在按钮上。如果是这样,我们就取消它。这似乎可以取消意外的点击。

关于javascript - 在 Firefox 中,在 keydown 事件处理程序中更改焦点会自动单击已聚焦的内容。我该如何防止这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20863515/

相关文章:

javascript - SignalR 连接阻塞,直到页面图像加载

javascript - 从函数内部更改全局变量

javascript - 对此感到困惑 - 出现错误 "this.myfuntion() is not a function"

Javascript - 拖拽和克隆 Javascript

javascript - 如何根据 jQuery 中的复选框选择向表添加和删除 <tr>

javascript - 如何使用 jQuery 或 javascript 编辑父标签的 html?

javascript - 如何在HTTP get方法中返回数据库数据

jquery - 隐藏具有公共(public)类 Jquery 的下拉元素

javascript - HTML JQUERY 选择转换为 Spinner

javascript - "Uncaught TypeError: undefined is not a function"调用对象中的方法时Javascript中出现错误消息