$ .focus()不起作用


154

jQuery focus()文档状态的最后一个示例

$('#id').focus()

应该使输入集中(活动)。我似乎无法正常工作。

即使在此站点上的控制台中,我也在尝试将其用于搜索框

$('input[name="q"]').focus()

我什么也没得到。有任何想法吗?


2
您能告诉我们您的代码吗?
阿迪尔

我们将不得不知道更多,因为它对我来说很好用:jsfiddle.net/G7hwR/1只需单击右侧面板中的任意位置,它就会集中在…
Rob G

但是,专注于此页面是否应该工作?我提供的代码段?
Sam Selikoff 2013年

这取决于它所包含的内容。如果它没有任何内容,则可能在页面呈现之前就已运行...
Rob G

对于那些来自搜索的用户:浏览器的内置开发人员工具可能会干扰其功能focus()更多信息
aexl

Answers:


391

实际上,只要您不关注控制台,您给出的专注于此站点的示例就可以正常工作。不起作用的原因仅仅是因为它没有从开发控制台中窃取焦点。如果您在控制台中运行以下代码,然后在浏览器窗口中快速单击,则将其聚焦在搜索框中:

setTimeout(function() { $('input[name="q"]').focus() }, 3000);

至于您的另一个,过去给我带来麻烦的一件事是事件的顺序。您不能在尚未附加到DOM的元素上调用focus()。您要关注的元素是否已附加到DOM?


1
大!这对您的两个问题都有帮助吗?如果是这样,您可以将其标记为正确答案吗?我会非常感激:D
贾斯汀·沃肯汀

4
仅使用$('input [name =“ q”]')。focus();或不起作用时,不要使用开发人员工具
阿弥陀佛(Amitābha)2013年

12
哇,我已经为此苦苦挣扎了几个月,我只看到这是由于开发者控制台打开引起的。我的总是。谢谢!
2013年

20
为“您不能在未附加到DOM的元素上调用focus()”而为此+1。另外,似乎您无法在隐藏元素上调用它。
tandrewnichols 2015年

1
setTimeout解决操作中的问题才能使得它在patooty保持了巨大的痛苦。如果出现错误,则很难调试。无论您将元素插入DOM的何处,都应该在其中调用.focus()
凯文·比尔

55

在网上其他地方找到了解决方案...

$('#id').focus();

不工作。

$('#id').get(0).focus();

做过。


4
我之所以赞成这个解决方案,仅仅是因为它对我有用,而本页上较受欢迎的解决方案却没有。;-)
chriv

第二个选择似乎只是抓住dom元素,并使用常规的javascript版本而不是jquery版本。
danielson317 '16

7
您的页面上是否可能有多个ID为“ id”的元素?在这种情况下,DOM不会中断,但是您也不能将焦点分配给多个元素
DerpyNerd '16

我发现我必须使用window.setTimeout并将其延迟为0,然后一切正常。谢谢。我尝试的所有其他操作均在引导模式下失败。
韦德哈特勒

23

这里的一些答案建议setTimeout用来延迟关注目标元素的过程。其中一位提到目标位于模态对话框中。在setTimeout不知道使用该解决方案的具体细节的情况下,我无法进一步评论该解决方案的正确性。但是,我想我应该在这里提供一个答案,以帮助那些像我一样遇到此线程的人

问题的简单事实是,您不能专注于尚不可见的元素。如果遇到此问题,请确保在尝试聚焦目标时实际上是可见的。就我自己而言,我正在按照这些思路做一些事情

$('#elementid').animate({left:0,duration:'slow'});
$('#elementid').focus();

这没有用。当我从确实起作用的控制台执行$('#elementid')。focus()`时,我才意识到发生了什么。区别-在我的目标上方的代码中,无法确定目标实际上是可见的,因为动画可能不完整。线索就在那里

$('#elementid').animate({left:0,duration:'slow',complete:focusFunction});

function focusFunction(){$('#elementid').focus();}

符合预期。我最初也提出了setTimeout解决方案,它也起作用。但是,根据主机设备确保目标元素可见的过程的速度,任意选择的超时必定会早晚打破解决方案。


对我来说,相关的提示是“确保目标实际上是可见的”。当试图关注有条件渲染的元素时,这变得很重要。
查理·卡弗

或当要关注的元素具有时visibility:hidden-它不会变得关注。
bakrall

“您不能专注于尚不可见的元素”-我爱您。通过简单地添加100ms超时,我可以触发对隐藏搜索框的关注。谢谢!
LuBre

当心超时。在您的开发机器上工作的东西很可能在另一台机器上工作。
DroidOS

15

如果您使用bootstrap + modal,这对我有用:

  $(myModal).modal('toggle');
  $(myModal).on('shown.bs.modal', function() {
    $('#modalSearchBox').focus()
  });

8

以防万一其他人偶然发现这个问题并遇到与我相同的情况-单击其他元素后我试图设置焦点,但焦点似乎没有起作用。原来我只需要一个e.preventDefault();-这是一个示例:

$('#recipients ul li').mousedown(function(e) {
    // add recipient to list
    ...
    // focus back onto the input
    $('#message_recipient_input').focus();
    // prevent the focus from leaving
    e.preventDefault();
});

这有助于:

如果从mousedown事件处理程序中调用HTMLElement.focus(),则必须调用event.preventDefault()来防止焦点离开HTMLElement。来源:https//developer.mozilla.org/en/docs/Web/API/HTMLElement/focus


2
唯一的作品!触发器是一个弹出式div,单击可隐藏div并将一些值放在文本框中(不需要集中显示该值)。如果没有preventDefault,则无论-__-是什么,文本框始终处于焦点状态
rlatief

4

我知道这很旧,但今天却遇到了。没有一个答案对我有用,我发现确实有用的是setTimeout。我希望使用setTimeout可以将焦点放在模式的输入字段上。希望这可以帮助!


我也是!而且超时时间的长短确实有所不同。愚蠢的IE。
eaglei22'3

1
但这不适用于移动设备。在大多数情况下,移动浏览器都忽略了setTimeout中的所有内容
Kosmonaft

1
根据经验,使用setTimeout是一个不好的解决方案。您不能保证在用户计算机上执行的时间,因此,与时间有关的内容非常脆弱。
弥敦道

3

我也有这个问题。就我而言,有效的解决方案是在HTML元素上使用tabindex属性。

我正在使用ng-repeat列表中的某些li元素,但无法使用.focus()将焦点移到第一个li上,因此我只是在循环期间向每个li添加了tabindex属性。

所以现在 <li ng-repeat="user in users track by $index" tabindex="{{$index+1}}"></li>

+1是从0开始的索引。另外,在调用.focus()函数之前,请确保DOM中存在该元素。

我希望这有帮助。


2

对于那些因为使用“ $(element).show()”而无法工作的问题。我以另一种方式解决了它:

 var textbox = $("#otherOption");
 textbox.show("fast", function () {
    textbox[0].focus();
  });

因此,您不需要计时器,它将在show方法完成后执行。


这适用于任何其他过渡:slideDown()fadeIn()等等。
ÁlvaroGonzález'18

2

在focus()之前添加一个延迟。200毫秒就够了

function focusAndCursor(selector){
  var input = $(selector);
  setTimeout(function() {
    // this focus on last character if input isn't empty
    tmp = input.val(); input.focus().val("").blur().focus().val(tmp);
  }, 200);
}

0

刚才又遇到了这个问题,信不信由你,我要做的就是关闭开发人员工具。显然,“控制台”选项卡的焦点优先于页面内容。


0

确保该元素及其父元素可见。您不能对隐藏元素使用焦点



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.