2012-03-07 137 views
21

有些想法是,ELEMENT_ID.focus()是在某些时候隐藏的div内部。jquery .focus()不起作用的原因是什么?

这应该是容易解决的问题 - 但我挣扎:(

***代码工作正常 - 文本字段没有被集中在页面加载了

STEP1 [解决] JAVASCRIPT:

$("#goal-input").focus(); 

$('#goal-input').keypress(function(event){ 
var keycode = (event.keyCode ? event.keyCode : event.which); 
    if(keycode == '13') { 
etc, etc, etc 
} 

HTML

<input type="text" id="goal-input" name="goal" /> 

[STEP2] JAVASCRIPT:

if (goal) { 
      step1.fadeOut('fast', function() { 
      step1.hide(); 
      step2.fadeIn('fast'); 

etc, etc 

HTML:

<div id="step-2"> 
     <div class="notifications"> 
     </div> 
     <input type="text" id="name" name="name" placeholder="Name" /> 
       <script type="text/javascript"> 
       $(function(){ 
       $("#name").focus(); 
       }); 
      </script> 

为什么没有第2步的工作? :(

+3

一些示例代码如何? - 根据['.focus()'](http://api.jquery.com/focus/)上的jQuery文档:尝试将焦点设置为隐藏元素会导致Internet Explorer中出现错误。注意只在可见的元素上使用.focus()。要运行元素的焦点事件处理程序而不将焦点设置到元素上,请使用.triggerHandler(“focus”)而不是.focus()。 – Morgon 2012-03-07 05:47:02

+0

你是什么意思“不工作”?例如。,代码运行时没有报告任何错误,但是焦点没有按照你的意愿设置,或者浏览器是否给出错误? – nnnnnn 2012-03-07 05:53:17

+0

提供了示例代码和什么“不工作”的意思(文本字段不关注)@nnnnnn – dngoo 2012-03-07 06:29:23

回答

12

您需要可以把HTML或负载下面的代码,如果使用文件装载事件:

<input type="text" id="goal-input" name="goal" /> 
<script type="text/javascript"> 
$(function(){ 
    $("#goal-input").focus(); 
}); 
</script> 

更新:

切换的div不会触发因为一切都已经被加载文档加载事件。你需要,当你切换div来关注它:

if (goal) { 
     step1.fadeOut('fast', function() { 
      step1.hide(); 
      step2.fadeIn('fast', function() { 
       $("#name").focus(); 
      }); 
     }); 
} 
+2

我会尽量说,所有与DOM相关的代码应该总是进入DOM负载处理程序中,而不管它与目标的相对位置。 :) – Morgon 2012-03-07 06:34:12

+0

演示:http://jsfiddle.net/BXpkY/ – 2012-03-07 06:37:18

+0

这表明,简单地隐藏和显示父'div'应该改变'$ .focus()'射击:http://jsfiddle.net/3Sz8Z/ – 2012-03-07 06:41:25

3

尝试是这样的,当你申请集中这样,如果该元素是隐藏的,它不会引发错误:

$("#elementid").filter(':visible').focus(); 

它可能更有意义,使元素可见,虽然这将需要特定的代码到你的布局

5

不要忘了,输入字段必须是可见光第一,此后你能够集中精力了。

$("#elementid").show(); 
$("#elementid input[type=text]").focus(); 
25

我有被转变到页面的元件(一个形式输入)上触发了焦点问题。我发现它可以通过在setTimeout中调用焦点事件而无延迟地修复。据我所知(例如,从this answer),这延迟了功能,直到当前执行队列结束,所以在这种情况下它延迟焦点事件,直到转换完成。

setTimeout(function(){ 
    $('#goal-input').focus(); 
}); 
+0

这对我有用,ty! – 2016-01-20 11:31:04

+0

高招... – 2016-06-27 13:17:25

+0

我只好用600超时前,它开始工作,所以'的setTimeout(函数(){$( '#目标输入')专注();},600);'在上面的例子。 – SharpC 2016-11-17 12:56:55

3

我发现,试图获得焦点的文本元素(如通知div)时focus不工作,而是着眼于输入字段时不工作。

相关问题