【问题标题】:Why doesn't focus() select my container div?为什么 focus() 不选择我的容器 div?
【发布时间】:2010-10-25 13:22:16
【问题描述】:

我有一个包含 JavaScript 的 index.html:

byId("p").value = page;
byId("nav_container").focus();
document.forms["nav_form_main"].submit();

焦点部分在这里不起作用。

我希望浏览器专注于页面的特定部分(几乎在顶部)。

我尝试将焦点放在 submit() 之后,同样的问题。

【问题讨论】:

  • 我认为byId()document.getElementById() 的快捷功能?

标签: javascript html forms


【解决方案1】:

确保要聚焦的元素具有tabindex="-1" 属性,否则该元素不可聚焦。

例如

<div id="myfocusablediv" tabindex="-1"></div>

当您为一个元素设置 tabindex=-1 时,它允许它通过 javascript 获取 focus()。相反,如果您希望它通过在元素之间切换来获得焦点,那么您可以将 tabindex 属性设置为 0。

【讨论】:

  • tabindex 部分很好,但它不必为 -1,它可以是对特定页面有意义的任何值。
  • 就我而言,没有任何改变。我也无法从控制台命令中获得焦点,也不知道为什么(尝试了纯 javascript 和 jquery)。
  • 在 chrome 上通过关闭开发工具 stackoverflow.com/a/41474220/7026966 尝试 focus()
【解决方案2】:

当我想强制某个表单元素获得焦点时,我会这样做:

function setFocusFixed( elm ){
    if( !input ) return;

    var savedTabIndex = elm.getAttribute('tabindex')
    elm.setAttribute('tabindex', '-1')
    elm.focus()
    elm.setAttribute('tabindex', savedTabIndex)
}

// DEMO: 

var buttons = document.querySelectorAll('button'),
    input   = document.querySelector('input');

buttons[0].addEventListener('click', ()=>input.focus())
buttons[1].addEventListener('click', ()=>setFocusFixed(input))
<input placeholder='some input' tabindex='2' />
<button>Set focus on input</button>
<button>Set focus on input - fixed</button>

这个小函数只是将表单字段tabindex 设置为-1,这样DOM 的focus() 方法就会生效,并立即将其设置回原来的值。

2019 年 8 月更新:

似乎在 Chrome 76 上给予焦点可以正常工作,没有 -1 tabindex 技巧。

【讨论】:

    【解决方案3】:

    您需要一个属性 tabindex="0" 才能聚焦(对我有用):tabindex="-1" 从页面选项卡序列中删除元素(例如,它不再可以通过键盘聚焦)。

    • -1 在某些情况下仍可聚焦,但不能通过键盘(Tab 键)聚焦,
    • 0 可按自动顺序聚焦
    • 任何其他正数都定义了聚焦元素的顺序

    https://www.w3.org/TR/wai-aria-practices/examples/tabs/tabs-1/tabs.html

    https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex

    【讨论】:

      【解决方案4】:

      提交表单后,任何焦点都变得无关紧要。文档将位置更改为表单的操作,并且无论如何都会丢失焦点。

      看起来你想在提交之后设置焦点,在这种情况下,在 onload 事件中进行:

      window.onload = function WindowLoad(evt) {
         byId("nav_container").focus();
      }
      

      正如其他人所提到的,如果“nav_container”不是输入框,它也不会工作,滚动到该位置使用命名锚点。在元素之前添加这样的锚点:

      <a name="nav_container_anchor" />
      

      然后让这样的 JS 代码滚动到那个位置:

      document.location = "#nav_container_anchor";
      

      【讨论】:

        【解决方案5】:

        也许你打开了开发工具。我刚刚遇到这个问题,当我关闭 devtools 时一切正常。

        【讨论】:

        • 是的,我同意,我也遇到了同样的问题。如果开发者工具打开,你的 DOMelement.focu() 可能无法工作
        猜你喜欢
        • 2013-07-05
        • 2019-12-31
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 2019-09-29
        • 2022-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多