1. 程式人生 > >JQuery事件繫結函式中的bind,live,delegate,on的差別?

JQuery事件繫結函式中的bind,live,delegate,on的差別?

bind:把事件繫結到每一個匹配的元素上,主要特點

1.相容性比較好

2.繫結事件到所有選出來的元素上

3.不會繫結事件到動態新增的那些元素上

4.當元素很多時,會出現效率問題,特別是巢狀層次比較深的元素。

html程式碼

<ul id="ul">
    <li>NO1</li>
    <li>NO2</li>
    <li>NO3</li>
    <li>NO4</li>
    <li>NO5</li>
</ul>

JavaScript程式碼

$("li").bind("click", function (event) {
    alert("OK");
});

Jquery程式碼:

除錯資料:

bind需要迴圈5次來繫結事件!

live把所有的事件都繫結到jquery物件$(document) ,主要特點:

1.事件只需要繫結一次,不需要繫結到篩選出來的元素上。

2.動態新增元素後依然擁有繫結事件。

3.不能使用event.stopPropagation() 來阻止事件的冒泡。

JavaScript程式碼

$("li").live("click", function (event) {
    alert("OK");
});

jquery原始碼同bind

除錯資料

live只執行一次,事件繫結在根節點物件上。

delegate將事件繫結到指定的父元素上,和live類似但比較能活。主要特點:

1.可以用在動態新增的元素上

2.繫結的父元素可以採用就近原則,減少查詢的次數,比live的效能好

3.在live和delegate兩者推薦使用delegate

JavaScript程式碼

$("#ul").delegate("li", "click", function (event) {
    alert("OK");
});

除錯資料

delegate只執行一次,事件繫結在呼叫物件

上。

---------------------  以上程式碼來源:https://blog.csdn.net/lxcao/article/details/52734965 

on()和bind()的區別

on()和bind()的函式簽名如下:

bind(type, [data], fn)
 
on(type,[selector],[data],fn)

可以看到2個函式的區別在於:是否支援selector這個引數值。由於javascript的事件冒泡特性,如果我們在父元素上註冊了一個事件處理函式,當子元素上發生這個事件的時候,父元素上的事件處理函式也會被觸發。如果使用on的時候,不設定selector,那麼on與bind就沒有區別了。

<div id="parent">
    <input type="button" value="a" id="a"/>
    <input type="button" value="b" id="b"/>
</div>

上面這段程式碼,如果我們使用bind()在parent上綁定了click事件處理函式,當點選a或者b按鈕的時候,都會執行事件處理函式。如果我們希望點選a的時候觸發,點選b的時候不觸發,那麼可以使用on,程式碼如下:

$("#parent").on("click","#a",function(){
    alert($(this).attr("id"));
});

可以看到:on()函式的引數selector就是為了在事件冒泡的時候,讓父元素能夠過濾掉子元素上發生的事件。如果使用了bind,那麼就沒有這個能力,子元素上發生的事件一定會觸發父元素事件。

---------------------  以上程式碼來源:https://blog.csdn.net/aitangyong/article/details/43673535