.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() 已被棄用。自 jQuery 1.7 以來,它已被 .on() 方法取代,用於將事件處理常式附加到文件,因此已不建議使用。對於早期版本,.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">(當它最初沒有「已輸入」類別時)的效果是在滑鼠進入 <div> 時加入「已輸入」類別,而在滑鼠離開時移除類別。

從 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 時會發生重大錯誤。

注意:儘管在下一範例中有示範,但建議不要將處理函式繫結到同一個元素的 clickdblclick 事件。觸發的事件順序會因瀏覽器而異,有些瀏覽器會在 dblclick 之前收到兩個 click 事件,而其他瀏覽器只會收到一個。雙擊靈敏度(偵測為雙擊的兩次點擊之間的最大時間)會因作業系統和瀏覽器而異,而且通常使用者可以設定。

範例

處理段落的點擊和雙擊。注意:座標是相對於視窗的,因此在此範例中是相對於示範 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.jquery.com/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.jquery.com/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" );
}
});