2013-04-07 48 views
95

last example of jQuery's focus() documentation状态

$('#id').focus() 

应使输入集中(活动)。我似乎无法得到这个工作。

即使在本网站上的控制台,我想它的搜索框

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

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

+2

你能告诉我们你的代码吗? – Adil 2013-04-07 05:13:46

+0

我们必须知道更多,因为它适用于我:http://jsfiddle.net/G7hwR/1/只需单击右侧面板中的任意位置,然后将它聚焦... – 2013-04-07 05:17:25

+0

不应该将重点放在此页面上工作,但?我提供的片段? – 2013-04-07 05:18:12

回答

257

实际上,您专注于此网站的示例工作得很好,只要您不专注于控制台。不工作的原因仅仅是因为它不是从开发控制台窃取焦点。如果您在控制台中运行下面的代码,然后迅速点击后,浏览器窗口,你会看到它专注于搜索框:

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

至于你另外一个,有一两件事给了我麻烦过去是事件的顺序。您不能在未连接到DOM的元素上调用focus()。您尝试关注的元素是否已附加到DOM?

+0

就是这样。我发誓这不是一个时间问题(它是),但我疯了,因为它不是从控制台工作。我发誓我之前从控制台做过。谢谢! – 2013-04-07 05:24:15

+1

太棒了!这有助于解决你的两个问题吗?如果是这样,你能把它标记为正确答案吗?我非常感激:D – 2013-04-07 05:35:47

+0

- 当然是在时间限制之前。再次感谢。当只使用$('input [name =“q”]')时, – 2013-04-07 06:13:20

30

发现在网络上其他地方的解决方案......

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

没有工作。

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

确实有效。

+2

我对此解决方案进行了升级,仅仅是因为它适用于本页更受欢迎的解决方案。 ;-) – chriv 2016-01-21 19:56:06

+0

第二个选项似乎是抓住了DOM元素,并使用常规的JavaScript版本,而不是jQuery版本。 – danielson317 2016-02-26 22:49:29

+0

这是最终为我工作的那个人!谢谢! – Hua 2016-07-13 17:00:46

4

我意识到这是旧的,但今天遇到它。没有答案为我工作,我发现工作的是setTimeout。我希望我的重点放在模态的输入字段上,使用setTimeout工作。希望这可以帮助!

+0

我也是!而超时的长度真的有所不同。愚蠢的IE浏览器。 – eaglei22 2017-03-03 14:21:30

+0

但它不适用于移动设备。移动浏览器在大多数情况下忽略了setTimeout中的所有内容 – Kosmonaft 2017-06-13 02:57:06

+1

作为一个经验法则,使用'setTimeout'是一个_bad_解决方案。你不能保证用户机器上的执行时间,所以时间依赖的东西是非常脆弱的。 – Nathan 2017-09-13 16:15:42

6

这里的一些答案建议使用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解决方案,它也工作。然而,随意选择的超时值必然迟早会破坏解决方案,这取决于主机设备在确保目标元素可见的情况下执行的速度有多慢。

+0

我的相关提示是“确保目标实际上可见”。这在尝试专注于有条件渲染的元素时变得相关。 – 2017-11-04 04:25:41

2

,如果你使用bootstrap +模式,这对我工作:

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

这解决了我的问题。谢谢 – Quiver 2017-07-10 18:44:53

2

我也有这个问题。在我的情况下工作的解决方案是使用HTML元素的tabindex属性。

我对列表中的某些li元素使用了ng-repeat,并且我无法使用.focus()将焦点集中到第一个li,所以我只是在循环过程中将tabindex属性添加到每个li中。

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

这是+1指数从0开始 同时确保该元素存在于DOM调用.focus()函数

我希望这有助于之前。

2

为了防止其他人绊倒这个问题,并有同样的情况我 - 我试图设置焦点后点击另一个元素,但重点似乎并没有工作。原来我只是需要一个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

0

对于那些 “)$(元素).show(” 不工作,因为你使用的问题。我解决了它的下一个方法:

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

所以你不需要一个计时器,完成表演方法后,它将执行。

相关问题