【问题标题】:What are some reasons for jquery .focus() not working?jquery .focus() 不起作用的一些原因是什么?
【发布时间】:2012-03-24 16:22:25
【问题描述】:

有些想法是 ELEMENT_ID.focus() 在特定时间隐藏的 div 中。

这应该是一个很容易解决的问题——但我正在苦苦挣扎:(

***代码工作正常——页面加载时文本字段没有被关注。

第 1 步 [已解决] 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" />

[步骤 2] 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 步不起作用? :(

【问题讨论】:

  • 一些示例代码怎么样? -- 根据.focus() 上的jQuery 文档:Attempting to set focus to a hidden element causes an error in Internet Explorer. Take care to only use .focus() on elements that are visible. To run an element's focus event handlers without setting focus to the element, use .triggerHandler("focus") instead of .focus().
  • “不工作”是什么意思?例如,代码运行时是否没有报告任何错误,但焦点没有按照您的意愿设置,或者浏览器是否给出错误?
  • 提供了示例代码以及“不工作”的含义(文本字段不关注)@nnnnnn
  • 这是什么意思? jsfiddle.net/GyXAt #textdoc.ready 之后从未关注过,尽管它显然会触发。
  • 在@Morgon 上方提供了示例代码

标签: jquery focus


【解决方案1】:

我在触发对过渡到页面的元素(表单输入)的关注时遇到问题。我发现它可以通过从 setTimeout 内部调用焦点事件来修复,并且没有延迟。据我了解(来自,例如this answer),这会延迟函数直到当前执行队列完成,所以在这种情况下,它会延迟焦点事件直到转换完成。

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

【讨论】:

  • 我必须在它开始工作之前使用 600 的超时时间,所以在上面的例子中是 setTimeout(function(){ $('#goal-input').focus(); }, 600);
  • 如果你对这类事情使用任意的、基于试验和错误的超时值,在某些情况下,对于某些人来说,它几乎肯定会失败(即 600 毫秒将是碰巧发生的值为您工作,在您的机器上,在您的网络上)。最好弄清楚为什么上面的方法不起作用(大概你还有其他影响页面状态的事情也妨碍了,或者你的 setTimeout 放错了地方)。
  • 谢谢!当我试图专注于 slideToggle-ing 元素内部的元素时,这对我也起到了作用。
  • 谢谢,这是一个我不知道的好概念。我在 .focus() 有时工作时遇到了麻烦,但在其他情况下却没有。这为我解决了。
  • @NickF 运气好吗?我遇到了同样的问题,但我不知道是什么导致了这个非常奇怪的故障
【解决方案2】:

如果使用文档加载事件,您需要将代码放在 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();
          });
      });
}

【讨论】:

  • 我想说的是,所有与 DOM 相关的代码都应该始终放在 DOM 加载处理程序中,而不管它与目标的相对位置如何。 :)
  • 这表明简单地隐藏和显示父 div 应该改变 $.focus() 触发:jsfiddle.net/3Sz8Z
  • @Morgon:我同意。但是在大多数浏览器中将它放在元素下方是有效的;)
  • jgauffin 的回答很有帮助:它适用于我的第一个文本输入。然后当我将它应用于第二个文本输入时,在我的第 2 步 div 中,它不起作用......(现在代码更新)
  • @jgauffin 嘿,感谢您的快速更新;我已经试过了+又试了一次。不工作o.O... -_-
【解决方案3】:

解决了!!!

setTimeout(function(){
    $("#name").filter(':visible').focus();
}, 500);

您可以相应地调整时间。

【讨论】:

    【解决方案4】:

    不要忘记输入字段必须首先可见,然后才能对其进行聚焦。

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

    【讨论】:

      【解决方案5】:

      当你以这种方式应用焦点时尝试这样的操作,如果元素被隐藏,它不会抛出错误:

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

      让元素可见可能更有意义,尽管这需要特定于您的布局的代码。

      【讨论】:

        【解决方案6】:

        我发现focus 在尝试关注文本元素(例如通知div)时不起作用,但在关注输入字段时却有效。

        【讨论】:

          【解决方案7】:

          只有“键盘可聚焦”元素可以用.focus() 聚焦。 div 并不意味着原生可聚焦。您必须向其添加 tabindex="0" 属性才能实现这一点。 inputbuttona 等...原生可聚焦。

          【讨论】:

            【解决方案8】:

            我的问题是我在站点的最后一个未禁用元素中输入了一个值,并使用选项卡来引发 onChange-Event。 之后没有下一个元素可以获取焦点,因此“浏览器”焦点切换到浏览器功能(选项卡、菜单等)并且不再位于 html 内容中。

            要理解这一点,请在 html 代码的末尾放置一个显示的、未禁用的虚拟文本框。 这样您就可以“停放”焦点以供以后替换。 应该管用。就我而言。所有其他尝试均无效,setTimeout-Version 也是如此。

            检查了大约一个小时,因为它让我发疯:)

            伴侣

            【讨论】:

              【解决方案9】:

              如果在TAB 上调用focus() 按键event.preventDefault 会有所帮助

              当我在 .on('keydown')event.keyCode == 9 中使用它时,我无法集中精力工作。我必须添加一个event.preventDefault 以防止浏览器再次切换。

              正确代码

              $('#goal-input').on("keydown", function (event) {
                  var keycode = (event.keyCode ? event.keyCode : event.which);
                  if (keycode == '9') { // Keycode for TAB
                      $("#name").focus();
                      event.preventDefault();
                  }
              });
              

              代码错误!!!

              $('#goal-input').on("keydown", function (event) {
                  var keycode = (event.keyCode ? event.keyCode : event.which);
                  if (keycode == '9') { // Keycode for TAB
                      $("#name").focus();
                  }
              });
              

              【讨论】:

                【解决方案10】:

                问题是有一个 JavaScript .focus 和一个 jQuery .focus 函数。这个对 .focus 的调用是模棱两可的。所以它并不总是有效。我所做的是将我的 jQuery 对象转换为 JavaScript 对象并使用 JavaScript .focus。这对我有用:

                $("#goal-input")[0].focus();
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2019-09-29
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多