是否可以使用JavaScript focus()函数专注于<div>?


227

是否可以专注于<div>使用JavaScript focus()函数?

我有一个<div>标签

<div id="tries">You have 3 tries left</div>

我正在尝试着重于上述<div>使用:

document.getElementById('tries').focus();

但这是行不通的。有人可以建议....?


3
当您“关注”它时,您想发生什么?Divs不接受输入,因此您要闪烁边框还是闪烁背景高光等?
Michael Shimmins 2010年

@Michael,是的,我需要<div>来吸引用户的注意...
OM The Eternity


1
@michaelShimmins和其他任何人,如果将contenteditable设置为true,则<div>元素可以接受输入。(我查询的原因)
MattOlivos

1
div如果@MichaelShimmins 溢出并显示滚动条,则可以接受输入。当div带有滚动条的a聚焦时,箭头键将滚动其内容(而不是其他元素的内容,例如body)。
罗里·奥肯

Answers:


101
window.location.hash = '#tries';

这将滚动到所讨论的元素,实质上是“聚焦”它。


2
@Casey Chu:在Firefox中工作正常,但在Firefox中工作不正常,你有什么想法吗?
Haseeb Akhtar 2014年

它在某些Chrome版本中不起作用...但是,@ vinoths解决方案可以做到这一点
Charliemops

1
这行得通,但是...使用Angular会遇到问题!
卡洛斯·维尔德斯

@CarlosVerdes; Angular是否有解决方案?
Mac Vicious

3
不回答“焦点”问题,这不应该是正确的答案。就我而言,我想专注于“ contentEditable” div,而您的窍门无济于事。
arnaudambro

453

是的-这是可能的。为此,您需要分配一个tabindex ...

<div tabindex="0">Hello World</div>

tabindex为0会将标记“置于页面的自然制表符顺序”。较高的数字将赋予其特定的优先级顺序,其中1表示第一优先级,2表示第二优先级,依此类推。

您还可以将tabindex设置为-1,这将使div仅可通过脚本而不是用户进行聚焦。

document.getElementById('test').onclick = function () {
    document.getElementById('scripted').focus();
};
div:focus {
    background-color: Aqua;
}
<div>Element X (not focusable)</div>
<div tabindex="0">Element Y (user or script focusable)</div>
<div tabindex="-1" id="scripted">Element Z (script-only focusable)</div>
<div id="test">Set Focus To Element Z</div>

显然,拥有可以通过脚本聚焦的元素而不能通过其他输入法聚焦的元素(特别是如果用户仅使用键盘或受到类似限制的情况)是可耻的。还有许多标准元素在默认情况下可聚焦的,并且嵌入了语义信息以帮助用户。明智地使用此知识。


6
@Michael Shimmins,这使元素可以通过进行聚焦(以非标准方式!)focus()
斯特拉格

2
@Olical-我很确定这就是答案的最后一行所说的。如果您认为存在需要修改的问题,请告诉我。
Fenton

2
如果不清楚,则将其添加tabindex到元素中将使其可聚焦,从而启用focus()blur()方法,然后可以触发如下所示的聚焦:document.getElementById('tries').focus();
pilau 2014年

4
@SteveOwen,您好-在Firefox v42中似乎仍然可以使用。我在此答案中添加了一个代码段,因此您可以运行它并进行测试。
Fenton

9
@SteveOwen使用window.location.hash = ...是做到这一点的方法。焦点并不意味着“进入视野”,而只是意味着将焦点放在该元素上。
Fenton

76

document.getElementById('tries').scrollIntoView()作品。这比window.location.hash 固定位置时效果更好。


2
请注意,此解决方案在IE,Opera或Safari中将不起作用。
AlecRust

1
我刚刚在Chrome 65中尝试了此操作,但无法正常工作。叠加层div滚动到视图中,但焦点仍在背景div中。我知道的唯一可以肯定的方法是tabindex在overlay div中有一个tabbable元素(使用属性),然后focus()在该元素上使用。
thdoan '18

@ om-the-eternity已经声明他希望div引起用户的注意,因此,他需要的不是真正集中注意力(即使工作时这样做是不正确的)div,而是将其显示在屏幕上,这可以解决
Omar Vazquez

如果我在Chrome浏览器中执行此操作,它将继续滚动回到仍然聚焦的输入字段。特别是如果页面尚未加载完成。
罗杰·克鲁格

37

您可以使用tabindex

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

tabindex值可以允许一些有趣的行为。

  • 如果给定的值为“ -1”,则无法将其设置为选项卡,但可以通过编程方式(使用element.focus())将焦点赋予该元素。
  • 如果给定值为0,则该元素可以通过键盘进行聚焦并落入文档的制表流程中。大于0的值会创建优先级,其中1是最重要的。

1
哇,谢谢你。谢谢!否则我将不会想到这一点。
AVProgrammer

救生员,谢谢。如果没有此技巧,则可以在Edge中集中处理div,但不能在Chrome中进行处理。接受的答案很好,但我不想在URL中添加其他部分。
加州

拯救生命。使用chrome和firefox可以正常工作
Susampath

14
<div id="inner" tabindex="0">
    this div can now have focus and receive keyboard events
</div>

这仅在Chromium / Chrome 46中对我有效,仅与$('#inner').focus();
TNT 2015年

2

我想提出类似Michael Shimmin的建议,但不对元素或适用于它的CSS进行硬编码。

我只使用jQuery来添加/删除类,如果您不想使用jquery,则只需要替换add / removeClass

--Javascript

function highlight(el, durationMs) { 
  el = $(el);
  el.addClass('highlighted');
  setTimeout(function() {
    el.removeClass('highlighted')
  }, durationMs || 1000);
}

highlight(document.getElementById('tries'));

--CSS

#tries {
    border: 1px solid gray;
}

#tries.highlighted {
    border: 3px solid red;
}

1

document.getElementById('test').onclick = function () {
    document.getElementById('scripted').focus();
};
div:focus {
    background-color: Aqua;
}
<div>Element X (not focusable)</div>
<div tabindex="0">Element Y (user or script focusable)</div>
<div tabindex="-1" id="scripted">Element Z (script-only focusable)</div>
<div id="test">Set Focus To Element Z</div>


0

要使边框闪烁,可以执行以下操作:

function focusTries() {
    document.getElementById('tries').style.border = 'solid 1px #ff0000;'
    setTimeout ( clearBorder(), 1000 );
}

function clearBorder() {
    document.getElementById('tries').style.border = '';
}

这将使边框变成红色,持续1秒钟,然后再次将其删除。

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.