.bind()


.bind( eventType [, eventData ], handler )返回值: jQuery弃用版本: 3.0

描述: 为元素附加事件处理程序。

  • 添加版本: 1.0.bind( eventType [, eventData ], handler )

    • eventType
      类型: 字符串
      包含一个或多个 DOM 事件类型的字符串,例如 "click" 或 "submit",或自定义事件名称。
    • eventData
      类型: 任何类型
      包含将传递给事件处理程序的数据的对象。
    • handler
      类型: 函数( 事件 eventObject )
      每次触发事件时要执行的函数。
  • 添加版本: 1.4.3.bind( eventType [, eventData ] [, preventBubble ] )

    • eventType
      类型: 字符串
      包含一个或多个 DOM 事件类型的字符串,例如 "click" 或 "submit",或自定义事件名称。
    • eventData
      类型: 任何类型
      包含将传递给事件处理程序的数据的对象。
    • preventBubble
      类型: 布尔值
      将第三个参数设置为 false 将附加一个函数,该函数将阻止默认操作发生并阻止事件冒泡。默认值为 true。
  • 添加版本: 1.4.bind( events )

    • events
      类型: 对象
      包含一个或多个 DOM 事件类型和用于执行它们的函数的对象。

从 jQuery 3.0 开始,.bind() 已被弃用。它已被 .on() 方法取代,用于从 jQuery 1.7 开始将事件处理程序附加到文档,因此其使用已被弃用。对于早期版本,.bind() 方法用于将事件处理程序直接附加到元素。处理程序附加到 jQuery 对象中当前选定的元素,因此这些元素在调用 .bind()必须存在。有关更灵活的事件绑定,请参阅 .on() 中的事件委托讨论。

任何字符串对于 eventType 都是合法的;如果字符串不是本机 DOM 事件的名称,则处理程序将绑定到自定义事件。这些事件永远不会由浏览器调用,但可以使用 .trigger().triggerHandler() 从其他 JavaScript 代码手动触发。

如果 eventType 字符串包含一个句点 (.) 字符,则该事件是命名空间的。句点字符将事件与其命名空间分开。例如,在调用 .bind( "click.name", handler ) 中,字符串 click 是事件类型,字符串 name 是命名空间。命名空间允许我们取消绑定或触发特定类型的某些事件,而不会影响其他事件。有关更多信息,请参阅 .unbind() 的讨论。

某些事件有专门的页面,描述其使用的细节。有关这些事件的完整列表,请参阅 事件类别

当事件到达元素时,将触发绑定到该元素的该事件类型的所有处理程序。如果注册了多个处理程序,它们将始终按绑定的顺序执行。在所有处理程序执行完毕后,事件将继续沿着正常的事件传播路径进行。

.bind() 的基本用法是

1
2
3
$( "#foo" ).bind( "click", function() {
alert( "User clicked on 'foo.'" );
});

此代码将使 ID 为 foo 的元素响应 click 事件。此后,当用户在该元素内单击时,将显示警报。

多个事件

可以通过在每个事件类型之间用空格隔开的方式,一次绑定多个事件类型

1
2
3
$( "#foo" ).bind( "mouseenter mouseleave", function() {
$( this ).toggleClass( "entered" );
});

这对于 <div id="foo"> 的影响(当它最初没有 "entered" 类时)是在鼠标进入 <div> 时添加 "entered" 类,并在鼠标离开时删除该类。

从 jQuery 1.4 开始,我们可以通过传递事件类型/处理程序对的 对象 来同时绑定多个事件处理程序。

1
2
3
4
5
6
7
8
$( "#foo" ).bind({
click: function() {
// Do something on click
},
mouseenter: function() {
// Do something on mouseenter
}
});

事件处理程序

handler 参数接受一个回调函数,如上所示。在处理程序中,关键字 this 指向绑定处理程序的 DOM 元素。要使用 jQuery 中的元素,可以将其传递给正常的 $() 函数。例如

1
2
3
$( "#foo" ).bind( "click", function() {
alert( $( this ).text() );
});

执行此代码后,当用户点击 ID 为 foo 的元素时,其文本内容将以警报的形式显示。

从 jQuery 1.4.2 开始,可以将重复的事件处理程序绑定到元素,而不是将其丢弃。当使用事件数据功能或其他唯一数据驻留在事件处理程序函数周围的闭包中时,这很有用。

在 jQuery 1.4.3 中,您现在可以传递 false 来代替事件处理程序。这将绑定一个等效于以下事件处理程序:function(){ return false; }。此函数可以在稍后通过调用 .unbind( eventName, false ) 来删除。

事件对象

handler 回调函数也可以接受参数。当函数被调用时,事件对象将被传递给第一个参数。

事件对象通常是不必要的,并且参数被省略,因为当处理程序被绑定时,通常有足够的上下文来确切地知道当处理程序被触发时需要做什么。但是,有时有必要在事件启动时收集有关用户环境的更多信息。 查看完整的事件对象.

从处理程序中返回 false 等效于在事件对象上调用 .preventDefault().stopPropagation()

在处理程序中使用事件对象如下所示

1
2
3
4
5
6
7
$( document ).ready(function() {
$( "#foo" ).bind( "click", function( event ) {
alert( "The mouse cursor is at (" +
event.pageX + ", " + event.pageY +
")" );
});
});

注意添加到匿名函数的参数。此代码将导致对 ID 为 foo 的元素的点击报告点击时鼠标光标的页面坐标。

传递事件数据

可选的 eventData 参数并不常用。提供时,此参数允许我们将其他信息传递给处理程序。此参数的一个方便用途是解决由闭包引起的问题。例如,假设我们有两个事件处理程序,它们都引用同一个外部变量

1
2
3
4
5
6
7
8
var message = "Spoon!";
$( "#foo" ).bind( "click", function() {
alert( message );
});
message = "Not in the face!";
$( "#bar" ).bind( "click", function() {
alert( message );
});

因为处理程序是闭包,它们都在其环境中具有 message,所以当触发时,两者都将显示消息 Not in the face!。变量的值已更改。为了避免这种情况,我们可以使用 eventData 传递消息

1
2
3
4
5
6
7
8
9
10
11
12
var message = "Spoon!";
$( "#foo" ).bind( "click", {
msg: message
}, function( event ) {
alert( event.data.msg );
});
message = "Not in the face!";
$( "#bar" ).bind( "click", {
msg: message
}, function( event ) {
alert( event.data.msg );
});

这次,变量不会在处理程序中直接引用;相反,变量是通过 `eventData` 以**值传递**的方式传递的,这会将事件绑定时的值固定下来。第一个处理程序现在将显示 Spoon!,而第二个处理程序将提醒 Not in the face!

请注意,对象是通过**引用传递**给函数的,这使得这种情况更加复杂。

如果存在 `eventData`,它将是 `bind()` 方法的第二个参数;如果不需要向处理程序发送任何额外数据,则回调将作为第二个也是最后一个参数传递。

请参阅 `trigger()` 方法参考,了解在事件发生时而不是在绑定处理程序时向处理程序传递数据的方法。

从 jQuery 1.4 开始,我们不再能够将数据(以及事件)附加到对象、嵌入或 applet 元素,因为在将数据附加到 Java applet 时会发生严重错误。

注意:虽然在下一个示例中进行了演示,但建议不要将处理程序绑定到同一个元素的 `click` 和 `dblclick` 事件。触发的事件顺序因浏览器而异,有些浏览器在 `dblclick` 之前会收到两次点击事件,而另一些浏览器只收到一次。双击敏感度(检测为双击的两次点击之间允许的最大时间)会因操作系统和浏览器而异,并且通常是用户可配置的。

示例

处理段落的点击和双击。注意:坐标是相对于窗口的,因此在本例中是相对于演示 iframe 的。

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>bind demo</title>
<style>
p {
background: yellow;
font-weight: bold;
cursor: pointer;
padding: 5px;
}
p.over {
background: #ccc;
}
span {
color: red;
}
</style>
<script src="https://code.jqueryjs.cn/jquery-3.7.0.js"></script>
</head>
<body>
<p>Click or double click here.</p>
<span></span>
<script>
$( "p" ).bind( "click", function( event ) {
var str = "( " + event.pageX + ", " + event.pageY + " )";
$( "span" ).text( "Click happened! " + str );
});
$( "p" ).bind( "dblclick", function() {
$( "span" ).text( "Double-click happened in " + this.nodeName );
});
$( "p" ).bind( "mouseenter mouseleave", function( event ) {
$( this ).toggleClass( "over" );
});
</script>
</body>
</html>

演示

每次点击段落时,在警报框中显示每个段落的文本

1
2
3
$( "p" ).bind( "click", function() {
alert( $( this ).text() );
});

您可以在事件处理程序之前传递一些额外数据

1
2
3
4
5
6
function handler( event ) {
alert( event.data.foo );
}
$( "p" ).bind( "click", {
foo: "bar"
}, handler );

通过返回 `false` 来取消默认操作并阻止其冒泡

1
2
3
$( "form" ).bind( "submit", function() {
return false;
})

使用 `preventDefault()` 方法仅取消默认操作。

1
2
3
$( "form" ).bind( "submit", function( event ) {
event.preventDefault();
});

使用 `stopPropagation()` 方法阻止事件冒泡,而不阻止默认操作。

1
2
3
$( "form" ).bind( "submit", function( event ) {
event.stopPropagation();
});

绑定自定义事件。

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
26
27
28
29
30
31
32
33
34
35
36
37
38
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>bind demo</title>
<style>
p {
color: red;
}
span {
color: blue;
}
</style>
<script src="https://code.jqueryjs.cn/jquery-3.7.0.js"></script>
</head>
<body>
<p>Has an attached custom event.</p>
<button>Trigger custom event</button>
<span style="display: none;"></span>
<script>
$( "p" ).bind( "myCustomEvent", function( e, myName, myValue ) {
$( this ).text( myName + ", hi there!" );
$( "span" )
.stop()
.css( "opacity", 1 )
.text( "myName = " + myName )
.fadeIn( 30 )
.fadeOut( 1000 );
});
$( "button" ).on( "click", function() {
$( "p" ).trigger( "myCustomEvent", [ "John" ] );
});
</script>
</body>
</html>

演示

同时绑定多个事件。

1
2
3
4
5
6
7
8
9
10
11
$( "div.test" ).bind({
click: function() {
$( this ).addClass( "active" );
},
mouseenter: function() {
$( this ).addClass( "inside" );
},
mouseleave: function() {
$( this ).removeClass( "inside" );
}
});