Javascript Can';当document.activeElement为body(或null)时,t在输入上设置焦点

Javascript Can';当document.activeElement为body(或null)时,t在输入上设置焦点,javascript,jquery,html,focus,tabindex,Javascript,Jquery,Html,Focus,Tabindex,快速上下文: 我有一个文本框列表,对于每个文本框,用户输入一个数字,然后在模糊的文本框上(用户点击标签),如果数字符合某些标准,则旁边有一个隐藏的下拉列表,该下拉列表将被取消隐藏,然后聚焦 问题: 当用户到达最后一个文本框并点击tab时,由于下拉列表在该点隐藏,用户已到达最后一个可聚焦元素,因此活动元素变为主体或空(有关更多信息,请参阅)。问题是-一旦发生这种情况,对页面上的任何元素调用focus()都不会起任何作用 示例: 在那里你可以看到这种行为。打开代码笔链接(最好是在Chrome中)后,

快速上下文:
我有一个文本框列表,对于每个文本框,用户输入一个数字,然后在模糊的文本框上(用户点击标签),如果数字符合某些标准,则旁边有一个隐藏的下拉列表,该下拉列表将被取消隐藏,然后聚焦

问题:
当用户到达最后一个文本框并点击tab时,由于下拉列表在该点隐藏,用户已到达最后一个可聚焦元素,因此活动元素变为主体或空(有关更多信息,请参阅)。问题是-一旦发生这种情况,对页面上的任何元素调用
focus()
都不会起任何作用

示例:
在那里你可以看到这种行为。打开代码笔链接(最好是在Chrome中)后,打开开发者工具控制台。单击第二个(中间)文本框,然后点击TAB。观察您的控制台-1秒后,当前活动元素将被记录(您可以看到它将显示为#input-3),控制台将显示“准备聚焦于#input-1”…,然后再过2秒,代码将尝试在第一个文本框(#input-1)上设置聚焦。当它位于可聚焦元素上时,它会成功地执行此操作。但是,如果单击最后一个文本框并单击TAB,它会说活动元素为body,然后它会尝试聚焦于#input-1,但不会发生任何事情


那么问题出在哪里?当document.activeElement为body或null时,我如何通过编程将焦点设置在元素上?

这取决于焦点必须实际离开元素是否有原因。您的代码笔使用键控事件,该事件在模糊发生之前触发。这足够早,可以防止焦点使用
event.preventDefault()进行移位(同步,无超时!):

这有点复杂,如果您不关心Firefox的兼容性,可以使用
focusout
事件编写,该事件在focus离开元素之前触发:

$('input').on('focusout', function(event) {
    if(/* are criteria fullfilled? */) {
          $(/* target element */).focus();
   }
)}
顺便说一句,
focusout
事件最终出现在最新的Firefox版本中(52):

$('input').on('focusout', function(event) {
    if(/* are criteria fullfilled? */) {
          $(/* target element */).focus();
   }
)}