采用事件委托最直觀的感受就是,不需要給每一個指定的元素綁定事件,從而降低了繁瑣的綁定過程,節(jié)約了代碼量,同時也節(jié)約了內(nèi)存的開銷。綁定一個事件都是需要占用內(nèi)存消耗的,除了性能的差異,通過委托的事件還能很友好的支持動態(tài)綁定,只要 on 的 delegate 對象是 HTML 頁面原有的元素,由于是事件的觸發(fā)是通過 Javascript 的事件冒泡機制來監(jiān)測,所以對于所有子元素(包括后期通過 JS 生成的元素)所有的事件監(jiān)測均能有效,且由于不用對多個元素進行事件綁定,能夠有效的節(jié)省內(nèi)存的損耗。
那么 jQuery 對事件的綁定分別有幾種 API,具體有什么區(qū)別我們來了解一下:
bind方法
.bind()方法用于直接附加一個事件處理程序到元素上,處理程序附加到 jQuery 對象中當前選中的元素,所以在 .bind() 綁定事件的時候這些元素必須已經(jīng)存在,很明顯就是直接調(diào)用沒利用委托機制。
live方法
將委托的事件處理程序附加到一個頁面的 document 元素,從而簡化了在頁面上動態(tài)添加的內(nèi)容上事件處理的使用。
例如:
$('a').live('click', function() { alert("!")})
JQuery 把 alert 函數(shù)綁定到 $(document) 元素上,并使用 ’click’和 ’a’作為參數(shù)。任何時候只要有事件冒泡到 document 節(jié)點上,它就查看該事件是否是一個 click 事件,以及該事件的目標元素與’a’這一CSS 選擇器是否匹配,如果都是的話,則執(zhí)行函數(shù)。
因為更高版本的 jQuery 提供了更好的方法,沒有 .live() 方法的缺點,所以 .live() 方法不再推薦使用,特別是使用 .live() 出現(xiàn)的以下問題:
delegate方法
為了突破單一 .bind() 方法的局限性,實現(xiàn)事件委托,jQuery 1.3引入了.live()方法。后來,為解決“事件傳播鏈”過長的問題,jQuery 1.4又支持為 .live() 方法指定上下文對象。而為了解決無謂生成元素集合的問題,jQuery 1.4.2干脆直接引入了一個新方法 .delegate()
使用 .delegate(),前面的例子可以這樣寫:
$('#element).delegate('a', 'click', function() { alert("!!!") });
jQuery 掃描文檔查找(‘#element’),并使用 click 事件和’a’這一CSS選擇器作為參數(shù)把 alert 函數(shù)綁定到(‘#element)上。
任何時候只要有事件冒泡到$(‘#element)上,它就查看該事件是否是click事件,以及該事件的目標元素是否與CCS選擇器相匹配。如果兩種檢查的結(jié)果都為真的話,它就執(zhí)行函數(shù)。
可以注意到,這一過程與.live()類似,但是其把處理程序綁定到具體的元素而非document這一根上。
那么 (′a′).live()==(document).delegate('a') ?
可見,.delegate() 方法是一個相對完美的解決方案。但在DOM結(jié)構(gòu)簡單的情況下,也可以使用.live()。
on方法
其實 .bind(), .live(), .delegate()都是通過.on()來實現(xiàn)的,.unbind(), .die(), .undelegate()也是一樣的都是通過.off()來實現(xiàn)的,提供了一種統(tǒng)一綁定事件的方法。
總結(jié):
在下列情況下,應(yīng)該使用 .live()或 .delegate(),而不能使用 .bind():
1. 為DOM中的很多元素綁定相同事件; 2. 為DOM中尚不存在的元素綁定事件; 3. 用.bind()的代價是非常大的,它會把相同的一個事件處理程序hook到所有匹配的DOM元素上 4. 不要再用.live()了,它已經(jīng)不再被推薦了,而且還有許多問題 5. .delegate()會提供很好的方法來提高效率,同時我們可以添加一事件處理方法到動態(tài)添加的元素上
我們可以用 .on() 來代替上述的 3 種方法。
不足點也是有的:
1. 并非所有的事件都能冒泡,如load, change, submit, focus, blur 2. 加大管理復(fù)雜 3. 不好模擬用戶觸發(fā)事件 4. 如何取舍就看項目實際中運用了
請驗證,完成請求
由于請求次數(shù)過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報