首頁 web前端 js教程 jQuery事件綁定與委託實例_jquery

jQuery事件綁定與委託實例_jquery

May 16, 2016 pm 04:30 PM
jquery 事件 委託 綁定

本文實例講述了jQuery事件綁定和委託。分享給大家供大家參考。具體方法如下:

jQuery事件的綁定和委託可以用多種方法實現,on()  、 bind()  、 live()  、 delegate() ,還有one()。
 
有時我們可能會像下面這樣綁定一個事件:

複製程式碼 程式碼如下:
$("#div1").click(function() { 
    alert("點擊後觸發"); 
});

上面的事件綁定,我們可以用多種方式去實現:
 
1. on()

複製程式碼 程式碼如下:
//無資料參數 
$("p").on("click", function(){ 
alert( $(this).text() ); 
}); 
 
//有資料參數 
function myHandler(event) { 
alert(event.data.foo); 

$("p").on("click", {foo: "bar"}, myHandler)

與on()對應的是off(),用來移除事件綁定:

複製程式碼 程式碼如下:
var foo = function () { 
  // code to handle some kind of event 
}; 
// ... now foo will be called when paragraphs are clicked ... 
$("body").on("click", "p", foo); 
 
// ... foo will no longer be called. 
$("body").off("click", "p", foo);

off():移除on()進行的綁定
one():只綁定一次。
 
2. bind()

參數:
(type,[data],function(eventObject))
type: 含​​有一個或多個事件類型的字串,由空格分隔多個事件。例如"click"或"submit",還可以是自訂事件名稱。
data:作為event.data屬性值傳遞給事件物件的額外資料物件
 
fn:綁定到每個符合元素的事件上面的處理函數
 
(type,[data],false)
type:含有一個或多個事件類型的字串,由空格分隔多個事件。例如"click"或"submit",還可以是自訂事件名稱。
data:作為event.data屬性值傳遞給事件物件的額外資料物件
 
false: 將第三個參數設為false會使預設的動作失效。
 
同時綁定多個事件類型:

複製程式碼 程式碼如下:
$('#foo').bind('mouseenter mouseleave', function() { 
  $(this).toggleClass('entered'); 
});

同時綁定多個事件類型/處理程序:

複製程式碼 程式碼如下:
$("button").bind({ 
  click:function(){$("p").slideToggle();}, 
  mouseover:function(){$("body").css("background-color","re​​d");},   
  mouseout:function(){$("body").css("background-color","#FFFFFF");}   
});

你可以在事件處理前傳遞一些附加的資料。

複製程式碼 程式碼如下:
function handler(event) { 
  alert(event.data.foo); 

$("p").bind("click", {foo: "bar"}, handler)


透過傳回false來取消預設的行為並阻止事件起泡。

複製程式碼 程式碼如下:
$("form").bind("submit", function() { return false; })

bind存在的問題

如果表格中要綁定點擊事件的有10列500行,那麼查找和遍歷5000個單元格會導致腳本執行速度明顯變慢,而保存5000個td元素和相應的事件處理程序也會佔用大量記憶體(類似於讓每個人親自站在門口等快遞)。

在前面這個例子的基礎上,如果我們想實現一個簡單的相簿應用,每頁只顯示50張照片的縮圖(50個單元格),用戶點擊「第x頁」(或「下一頁」)連結可以透過Ajax從伺服器動態載入另外50張照片。在這種情況下,似乎使用.bind()方法為50個單元格綁定事件又可以接受了。

事實卻不然。使用.bind()方法只會給第一頁中的50個儲存格綁定點擊事件,動態載入的後續頁面中的儲存格都不會有這個點擊事件。換句話說,.bind()只能給呼叫它的時候已經存在的元素綁定事件,不能給未來新增的元素綁定事件(類似新來的員工收不到快遞)。

事件委託可以解決上述兩個問題。具體到程式碼上,只要用jQuery 1.3新增的.live()方法取代.bind()方法即可:

複製程式碼 程式碼如下:
$("#info_table td").live("click",function() {/*顯示更多資訊*/});

這裡的.live()方法會把click事件綁定到$(document)物件(但這點從程式碼中體現不出來,這也是.live()方法飽受批評的一個重要原因,稍後再詳細討論),而且只需要給$(document)綁定一次(不是50次,更不是5000次),然後就能夠處理後續動態載入的照片儲存格的點擊事件。在接收到任何事件時,$(document)物件都會檢查事件類型和事件目標,如果是click事件且事件目標是td,那麼就執行委託給它的處理程序。
 
unbind():移除bind進行的綁定。
 
3. live()

到目前為止,一切似乎都很完美。可惜,事實並非如此。因為.live()方法並不完美,它有以下幾個主要缺點:
$()函數會找到目前頁面中的所有td元素並建立jQuery對象,但在確認事件目標時卻不用這個td元素集合,而是使用選擇符表達式與event.target或其祖先元素進行比較,因而產生這個jQuery物件會造成不必要的開銷;
預設把事件綁定到$(document)元素,如果DOM嵌套結構很深,事件冒泡通過大量祖先元素會導致效能損失;
只能放在直接選擇的元素後面,不能在連綴的DOM遍歷方法後面使用,即$("#info_table td").live...可以,但$("#info_table").find("td" ).live...不行;
收集td元素並建立jQuery對象,但實際操作的卻是$(document)對象,令人費解。
解決之道
為了避免產生不必要的jQuery對象,可以使用一種叫做「早期委託」的hack,即在$(document).ready()方法外部呼叫.live():

複製程式碼 程式碼如下:
(function($){ 
    $("#info_table td").live("click",function(){/*顯示更多資訊*/}); 
})(jQuery);

在此,(function($){...})(jQuery)是一個“立即執行的匿名函數”,構成了一個閉包,可以防止命名衝突。在匿名函數內部,$參數引用jQuery物件。這個匿名函數不會等到DOM就緒就會執行。注意,使用這個hack時,腳本必須是在頁面的head元素中連結和(或)執行的。之所以選擇這個時機,因為這時候剛好document元素可用,而整個DOM還遠未生成;如果把腳本放在結束的body標籤前面,就沒有意義了,因為那時候DOM已經完全可用了。

為了避免事件冒泡造成的效能損失,jQuery從1.4開始支援在使用.live()方法時配合使用一個上下文參數:

複製程式碼 程式碼如下:
$("td",$("#info_table")[0]). live("click",function(){/*顯示更多資訊*/});

這樣,「受託方」就從預設的$(document)變成了$("#info_table")[0],節省了冒泡的旅程。不過,與.live()共同使用的上下文參數必須是單獨的DOM元素,所以這裡指定上下文物件時使用的是$("#info_table")[0],也就是使用陣列的索引運算子來取得的一個DOM元素。 
 
4. delegate()

如前所述,為了突破單一.bind()方法的局限性,實現事件委託,jQuery 1.3引入了.live()方法。後來,為解決「事件傳播鏈」過長的問題,jQuery 1.4又支援為.live()方法指定上下文物件。而為了解決無謂生成元素集合的問題,jQuery 1.4.2乾脆直接引入了一個新方法.delegate()。
 
使用.delegate(),前面的範例可以這樣寫:

複製程式碼 程式碼如下:
$("#info_table").delegate("td","click",>$("#info_table").delegate("td","click", function(){/*顯示更多資訊*/});

使用.delegate()有以下優點(或解決了.live()方法的以下問題):
直接將目標元素選擇符("td")、事件("click")及處理程序與「受拖方」$("#info_table")綁定,不額外收集元素、事件傳播路徑縮短、​​語意明確;

支援在連綴的DOM遍歷方法後面調用,即支援$("table").find("#info").delegate...,支援精確控制;

可見,.delegate()方法是一個相對完美的解決方案。但在DOM結構簡單的情況下,也可以使用.live()。

提示:使用事件委託時,如果註冊到目標元素上的其他事件處理程序使用.stopPropagation()阻止了事件傳播,那麼事件委託就會失效。
 
undelegate(): 移除delegate的綁定

希望本文所述對大家的jQuery程式設計有所幫助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

BTCC教學:如何在BTCC交易所綁定使用MetaMask錢包? BTCC教學:如何在BTCC交易所綁定使用MetaMask錢包? Apr 26, 2024 am 09:40 AM

MetaMask(中文也叫小狐狸錢包)是一款免費的、廣受好評的加密錢包軟體。目前,BTCC已支援綁定MetaMask錢包,綁定後可使用MetaMask錢包進行快速登錄,儲值、買幣等,且首次綁定還可獲得20USDT體驗金。在BTCCMetaMask錢包教學中,我們將詳細介紹如何註冊和使用MetaMask,以及如何在BTCC綁定並使用小狐狸錢包。 MetaMask錢包是什麼? MetaMask小狐狸錢包擁有超過3,000萬用戶,是當今最受歡迎的加密貨幣錢包之一。它可免費使用,可作為擴充功能安裝在網絡

小紅書怎麼綁定子帳號?它怎麼檢測帳號是否正常? 小紅書怎麼綁定子帳號?它怎麼檢測帳號是否正常? Mar 21, 2024 pm 10:11 PM

在現今這個資訊爆炸的時代,個人品牌和企業形象的建立變得越來越重要。小紅書作為國內領先的時尚生活分享平台,吸引了大量用戶關注和參與。對於那些希望擴大影響力、提高內容傳播效率的使用者來說,綁定子帳號成為了一種有效的手段。那麼,小紅書怎麼綁定子帳號呢?又如何檢測帳號是否正常呢?本文將為您詳細解答這些問題。一、小紅書怎麼綁定子帳號? 1.登入主帳號:首先,您需要登入您的小紅書主帳號。 2.開啟設定選單:點選右上角的“我”,然後選擇“設定”。 3.進入帳號管理:在設定選單中,找到「帳號管理」或「帳號助理」選項,點

今日頭條綁定抖音的步驟方法 今日頭條綁定抖音的步驟方法 Mar 22, 2024 pm 05:56 PM

1、打開今日頭條。 2、點選右下角我的。 3.點選【系統設定】。 4.點選【帳號和隱私設定】。 5.點選【抖音】右邊的按鈕即可綁定抖音。

jQuery中如何使用PUT請求方式? jQuery中如何使用PUT請求方式? Feb 28, 2024 pm 03:12 PM

jQuery中如何使用PUT請求方式?在jQuery中,發送PUT請求的方法與發送其他類型的請求類似,但需要注意一些細節和參數設定。 PUT請求通常用於更新資源,例如更新資料庫中的資料或更新伺服器上的檔案。以下是在jQuery中使用PUT請求方式的具體程式碼範例。首先,確保引入了jQuery庫文件,然後可以透過以下方式發送PUT請求:$.ajax({u

菜鳥app怎麼綁定拼多多 菜鳥裹裹怎麼添加拼多多平台 菜鳥app怎麼綁定拼多多 菜鳥裹裹怎麼添加拼多多平台 Mar 19, 2024 pm 02:30 PM

菜鳥app就是能夠提供你們各種物流資訊狀況的平台,這裡的功能非常的強大好用,大家有任何與物流相關的問題,都能在這得到解決的,反正都能為你們帶來一站式的服務,全都能及時解決的,查快遞,取快遞,寄快遞等,都是毫無任何問題,與各個的平台都進行了合作,全部的信息,都能查詢得到的,但是有些時候會出現拼多多當中購買的商品,都是無法呈現出物流的信息,其實是需要大家進行手動綁定拼多多,才能實現的,具體的方法已經整理出來了在下方,大家都能來看看的。菜鳥綁定拼多多帳戶的方法:  1、打開菜鳥APP,在主頁面

菜鳥APP怎麼綁定拼多多 菜鳥APP綁定拼多多方法 菜鳥APP怎麼綁定拼多多 菜鳥APP綁定拼多多方法 Mar 19, 2024 pm 05:16 PM

你們知道在使用菜鳥裹裹的時候是怎麼來綁定拼多多的嗎?菜鳥裹裹App官方正版在這款平台上面對於一些拼多多的物流信息是沒有自動同步上去的,我們需要做的就只能複製單號過來或是查詢你們的手機看看有無快遞的資訊。當然這些都是需要手動完成的,如果你們也想了解更多的話,就和小編一起來看看吧。  菜鳥APP怎麼綁定拼多多  1、打開菜鳥APP,在主頁點選左上角的「導包裹」。  2、在介面中,有許多購物網站,帳號都可以綁定。  3、點選導入其他電商平台。  4、使用者授權:點選拼多多到介面

小米汽車app怎麼綁定充電樁設備 小米汽車app怎麼綁定充電樁設備 Apr 01, 2024 pm 06:52 PM

最新小米最新推出的小米su7型號汽車霸佔了各種熱搜榜,許多正好有購車需求的用戶們都紛紛選擇了小米su7型號的汽車進行購買,那麼在提車以後如何利用自己的小米汽車app綁定家用充電樁充電呢,那麼這篇教學攻略就會為大家帶來詳細的內容介紹,希望能幫助大家。首先我們先打開小米手機app,點擊右下角我的按鈕然後在我的介面,可以看到家充樁的選項進入到綁定充電樁的頁面以後,點擊下方的去掃碼按鈕,掃描充電樁上的二維碼即可完成充電樁與app的綁定

jQuery小技巧:快速修改頁面所有a標籤的文本 jQuery小技巧:快速修改頁面所有a標籤的文本 Feb 28, 2024 pm 09:06 PM

標題:jQuery小技巧:快速修改頁面所有a標籤的文字在網頁開發中,我們經常需要對頁面中的元素進行修改和操作。使用jQuery時,有時候需要一次修改頁面中所有a標籤的文字內容,這樣可以節省時間和精力。以下將介紹如何使用jQuery快速修改頁面所有a標籤的文本,同時給出具體的程式碼範例。首先,我們需要引入jQuery庫文件,確保在頁面中引入了以下程式碼:&lt

See all articles