javascript - 输入模糊后无法将焦点返回到 div

标签 javascript jquery html focus blur

http://jsfiddle.net/NsRyr/1/

我完全被这个问题难住了。这就是我想要做的:我有一个 div 元素(称之为 #keys),我用它来处理按键事件。

HTML:

<div id="#keys" tabindex="1">Focus</div>

JS:

$('#keys').keydown(function () {
    $('#log').append('*'); // just note that an event happened
});

这按预期工作 - 只要 #keys 获得焦点,我就可以接收按键事件并响应它们。此外,我可以将焦点设置到其他 div 元素,并且按键事件将不再由 #keys 处理。然后我可以重新聚焦 div(例如,通过直接单击它,或通过响应另一个 DOM 元素上的 click 事件),并且按键事件将按照我的预期进行处理。

到目前为止,一切都很好。我遇到的问题是,如果我聚焦一个输入元素,然后尝试通过设置一个在 Tab 键离开后激活的 blur 处理程序来重新聚焦 #keys输入时,#keys div 未获得焦点!如果我通过单击模糊输入,效果很好,但如果我使用键盘,则效果不佳。

$('#input').blur(function () {
    $('#log').append('blur'); // note that a blur happened
    $('#keys').focus();
});

我认为这个问题的本质是,为什么我的 #input 上的 blur 处理程序在远离输入时似乎无法正常工作(但确实如此)点击离开时可以正常工作)?这只是浏览器的怪癖吗? (我在 Mac 操作系统上使用 Chrome 30.0.1599.101。)

这是我关于 JS 的第一个问题,所以请让我知道我可以提供哪些额外的细节来描述这种情况。

(编辑:有趣的是,如果我将 tab 键从 #input 移开,它似乎工作正常。仍然困惑这里发生的事情;似乎是某种与 tabindex 相关的问题?)

最佳答案

我还没有评论权限,所以我必须回答,但是请模组应该更改它,因为它基本上是重复的。

这是对你的 fiddle 的修复: http://jsfiddle.net/NsRyr/3/

问题(如 this answer 中所述)是模糊事件在更改完成之前触发,因此焦点需要向下发送到堆栈才能在更改完成后发生。添加计时器可以解决这个问题。

我更改的行是:

setTimeout($('#keys').focus.bind($('#keys')), 0);

这使得它会等到新的焦点事件完成后再触发处理程序。

关于javascript - 输入模糊后无法将焦点返回到 div,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19612329/

相关文章:

javascript - 在 Meteor 中加载 YouTube 播放器 API

javascript - 模拟点击 Javascript/jQuery 中的链接产生正常的浏览器行为

javascript - 如何在Intellij中jsDoc Node module.exports对象方法?

javascript - Web Crypto API - IndexedDB 中的不可精确 CryptoKey 是否足够安全,不会从一个设备传递到下一个设备?

javascript - jQuery datepicker- 具有 3 个字段的范围?

jquery - 如何使用jQuery根据单选按钮是否选中显示内容

html - 页面底部不需要的空白区域 - 找不到答案?

css - 页脚元素不 float

可滚动页面上的 Jquery Starfield 插件

javascript - 无法在动态$route AngularUI模式中访问$scope