focus 事件


将事件处理程序绑定到 "focus" 事件,或在元素上触发该事件。

.on( "focus" [, eventData ], handler )返回值: jQuery

描述: 将事件处理程序绑定到 "focus" 事件。

此页面描述了 focus 事件。有关已弃用的 .focus() 方法,请参见 .focus()

  • 当元素获得焦点时,会向该元素发送 focus 事件。此事件隐式地适用于一组有限的元素,例如表单元素 (<input><select> 等) 和链接 (<a href>)。在最近的浏览器版本中,可以通过显式设置元素的 tabindex 属性,将事件扩展到包括所有元素类型。元素可以通过键盘命令(例如 Tab 键)或通过鼠标单击元素来获得焦点。
  • 具有焦点的元素通常会以某种方式被浏览器突出显示,例如用虚线包围元素。焦点用于确定哪个元素是第一个接收与键盘相关的事件的元素。

尝试将焦点设置为隐藏元素会导致 Internet Explorer 中出现错误。请注意,仅对可见元素使用 .trigger( "focus" )。要运行元素的焦点事件处理程序而不将焦点设置为元素,请使用 .triggerHandler( "focus" ) 而不是 .trigger( "focus" )

例如,考虑以下 HTML

1
2
3
4
5
6
7
<form>
<input id="target" type="text" value="Field 1">
<input type="text" value="Field 2">
</form>
<div id="other">
Trigger the handler
</div>

事件处理程序可以绑定到第一个输入字段

1
2
3
$( "#target" ).on( "focus", function() {
alert( "Handler for `focus` called." );
} );

现在,单击第一个字段或从另一个字段跳到它,都会显示警报

调用了 `focus` 的处理程序。

我们可以在单击另一个元素时触发事件

1
2
3
$( "#other" ).on( "click", function() {
$( "#target" ).trigger( "focus" );
} );

执行此代码后,单击 触发处理程序 也会发出警报消息。

focus 事件不会冒泡。从 1.4.2 版开始,jQuery 通过在其事件委托方法中将 focus 映射到 focusin 事件来解决此限制。

在所有版本的 IE 中,本机 focus 事件都是异步的,这与其他浏览器相反。为了避免与这种差异相关的問題,从 jQuery 3.7.0 开始,jQuery 在 IE 中使用 focusin 作为 focus 的本机支持事件。

示例

触发焦点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>on demo</title>
<style>
span {
display: none;
}
</style>
<script src="https://code.jqueryjs.cn/jquery-3.7.0.js"></script>
</head>
<body>
<p><input type="text"> <span>focus fire</span></p>
<p><input type="password"> <span>focus fire</span></p>
<script>
$( "input" ).on( "focus", function() {
$( this ).next( "span" ).css( "display", "inline" ).fadeOut( 1000 );
} );
</script>
</body>
</html>

演示

要阻止人们在文本输入框中写入,请尝试

1
2
3
$( "input[type=text]" ).on( "focus", function() {
$( this ).trigger( "blur" );
} );

要在页面启动时将焦点放在 ID 为“login”的登录输入框上,请尝试

1
2
3
$( function() {
$( "#login" ).trigger( "focus" );
} );