1. 程式人生 > >淺談jquery之on()綁定事件和off()解除綁定事件

淺談jquery之on()綁定事件和off()解除綁定事件

span syntax num this code value 自己 冒泡 屬性

off()函數用於移除元素上綁定的一個或多個事件的事件處理函數。

off()函數主要用於解除由on()函數綁定的事件處理函數。

該函數屬於jQuery對象(實例)。

語法

jQuery 1.7 新增該函數。其主要有以下兩種形式的用法:

用法一:

jQueryObject.off( [ events [, selector ] [, handler ] ] )

用法二:

jQueryObject.off( eventsMap [, selector ] )

參數

參數描述
events 可選/String類型一個或多個用空格分隔的事件類型和可選的命名空間,例如"click"、"focus click"、"keydown.myPlugin"。
eventsMap Object類型一個Object對象,其每個屬性對應事件類型和可選的命名空間(參數events),屬性值對應綁定的事件處理函數(參數handler)。
selector 可選/String類型一個jQuery選擇器,用於指定哪些後代元素可以觸發綁定的事件。如果該參數為null或被省略,則表示當前元素自身綁定事件(實際觸發者也可能是後代元素,只要事件流能到達當前元素即可)。
handler 可選/Function類型指定的事件處理函數。

off()函數將會移除當前匹配元素上為後代元素selector綁定的events事件的事件處理函數handler。

如果省略參數selector,則移除為任何元素綁定的事件處理函數。

參數selector必須與通過on()函數添加綁定時傳入的選擇器一致。

如果省略參數handler,則移除指定元素指定事件類型上綁定的所有事件處理函數。

如果省略了所有參數,則表示移除當前元素上為任何元素綁定的任何事件類型的任何事件處理函數。

返回值
off()函數的返回值為jQuery類型,返回當前jQuery對象本身。

實際上,off()函數的參數全是篩選條件,只有匹配所有參數條件的事件處理函數才會被移除。參數越多,限定條件就越多,被移除的範圍就越小。

off()方法的代碼示例:

容易忽略的點:off所解除元素的綁定事件,其中選擇器必須和on綁定事件時所用的選擇器一致。

html代碼

?
1 2 3 <input id="btn1" type="button" value="點擊1" /> <input id="btn2" type="button" value="點擊2" /> <a id="a1" href="#">CodePlayer</a>

頁面加載時執行的jquery代碼

?
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 42 43 44 45 46 47 48 49 50 51 function btnClick1(){ alert( this.value + "-1" ); } function btnClick2(){ alert( this.value + "-2" ); } var $body = $("body"); // 給按鈕1綁定點擊 $body.on("click", "#btn1", btnClick1 ); // 給按鈕2綁定點擊 $body.on("click", "#btn2", btnClick2 ); //為所有a元素綁定click、mouseover、mouseleave事件 $body.on("click mouseover mouseleave", "a", function(event){ if( event.type == "click" ){ $body.off("click", "#btn1");//取消btn1的綁定事件。成功執行 alert("點擊事件"); alert("ddd"); }else if( event.type == "mouseover" ){ $(this).css("color", "red"); }else{ $(this).css("color", "blue"); } }); // 移除body元素為所有button元素的click事件綁定的事件處理函數btnClick2 // 點擊按鈕,btnClick1照樣執行 $body.off("click", ":button", btnClick2); // 點擊按鈕1,不會執行任何事件處理函數 // $body.off("click", "#btn1"); // 註意: $body.off("click", ":button"); 無法移除btn1的點擊事件,off()函數指定的選擇器必須與on()函數傳入的選擇器一致。 // 移除body元素為所有元素(包括button和<a>元素)的click事件綁定的所有處理函數 // 點擊按鈕或鏈接,都不會觸發執行任何事件處理函數 // $("body").off("click"); // 移除body元素為所有元素的任何事件綁定的所有處理函數 // 點擊按鈕,或點擊鏈接或者鼠標移入/移出鏈接,都不會觸發執行任何事件處理函數 // $("body").off( );

on()函數用於為指定元素的一個或多個事件綁定事件處理函數。

此外,你還可以額外傳遞給事件處理函數一些所需的數據。

從jQuery 1.7開始,on()函數提供了綁定事件處理程序所需的所有功能,用於統一取代以前的bind()、 delegate()、 live()等事件函數。

即使是執行on()函數之後新添加的元素,只要它符合條件,綁定的事件處理函數也對其有效。

此外,該函數可以為同一元素、同一事件類型綁定多個事件處理函數。觸發事件時,jQuery會按照綁定的先後順序依次執行綁定的事件處理函數。

要刪除通過on()綁定的事件,請使用off()函數。如果要附加一個事件,只執行一次,然後刪除自己,請使用one()函數。

該函數屬於jQuery對象(實例)。

語法

jQuery 1.7 新增該函數。其主要有以下兩種形式的用法:

用法一:

jQueryObject.on( events [, selector ] [, data ], handler )

用法二:

jQueryObject.on( eventsMap [, selector ] [, data ] )

參數

參數描述
events String類型一個或多個用空格分隔的事件類型和可選的命名空間,例如"click"、"focus click"、"keydown.myPlugin"。
eventsMap Object類型一個Object對象,其每個屬性對應事件類型和可選的命名空間(參數events),屬性值對應綁定的事件處理函數(參數handler)。
selector 可選/String類型一個jQuery選擇器,用於指定哪些後代元素可以觸發綁定的事件。如果該參數為null或被省略,則表示當前元素自身綁定事件(實際觸發者也可能是後代元素,只要事件流能到達當前元素即可)。
data 可選/任意類型觸發事件時,需要通過event.data傳遞給事件處理函數的任意數據。
handler Function類型指定的事件處理函數。

關於參數events中可選的命名空間,請參考最下面的示例代碼。

關於參數selector,你可以簡單地理解為:如果該參數等於null或被省略,則為當前匹配元素綁定事件;否則就是為當前匹配元素的後代元素中符合selector選擇器的元素綁定事件。

參數handler中的this指向當前匹配元素的後代元素中觸發該事件的DOM元素。如果參數selector等於null或被省略,則this指向當前匹配元素(也就是該元素)。

on()還會為handler傳入一個參數:表示當前事件的Event對象。

參數handler的返回值與DOM原生事件的處理函數返回值作用一致。例如"submit"(表單提交)事件的事件處理函數返回false,可以阻止表單的提交。

如果事件處理函數handler僅僅只為返回false值,可以直接將handler設為false。

返回值

on()函數的返回值為jQuery類型,返回當前jQuery對象本身。

重要說明:

on()函數並不是為當前jQuery對象匹配的元素綁定事件處理函數,而是為它們的後代元素中符合選擇器selector參數的元素綁定事件處理函數。on()函數並不是直接為這些後代元素挨個綁定事件,而是委托給當前jQuery對象的匹配元素來處理。由於DOM 2級的事件流機制,當後代元素selector觸發事件時,該事件會在事件冒泡中傳遞給其所有的祖輩元素,當事件流傳遞到當前匹配元素時,jQuery會判斷是哪個後代元素觸發了事件,如果該元素符合選擇器selector,jQuery就會捕獲該事件,從而執行綁定的事件處理函數。

淺談jquery之on()綁定事件和off()解除綁定事件