jQuery 為什麼要劃分.bind()和.live()?

直接用一個不行嗎?


似乎大多數回答是一年前的了 更新一下這裡的一些爭議吧

JQuery從1.7版本開始將bind(),live()和delegate()方法合併成了on()方法了

同樣unbind(),die()和undelegate()方法也合併成了off()方法

新舊API對比:

$("a").bind("click", myHandler);

$("a").on("click", myHandler);

$("form").bind("submit", { val: 42 }, fn);

$("form").on("submit", { val: 42 }, fn);

$(window).unbind("scroll.myPlugin");

$(window).off("scroll.myPlugin");

$(".comment").delegate("a.add", "click", addNew);

$(".comment").on("click", "a.add", addNew);

$(".dialog").undelegate("a", "click.myDlg");

$(".dialog").off("click.myDlg", "a");

$("a").live("click", fn);

$(document).on("click", "a", fn);

$("a").die("click");

$(document).off("click", "a");

了解更多:http://blog.jquery.com/2011/11/03/jquery-1-7-released/


性能神馬的都是浮雲 (因為 jQuery 優化得很不錯), 重點是 1.4.4 前的 live() 的不支持 stopPropagation()

http://jsfiddle.net/J4eUb/2/

至於用哪一個是根據應用場景來區分的, 沒有通用的規則


Best answer is here: http://www.alfajango.com/blog/the-difference-between-jquerys-bind-live-and-delegate/ , don"t trust city legend.


live() 是委託,事實上是綁定在父元素上,而bind()就是綁定在指定元素上


http://www.alfajango.com/blog/the-difference-between-jquerys-bind-live-and-delegate/:一篇關於這個問題深入淺出的文章。


這問題提了有幾年了,我記得live和bind過期也有好幾年時間了,現在都是.on()。


不一樣,live()可以實現動態綁定。

例如:$elem.bind("click",fn)時候,所有的$elem點擊都會觸發fn,但是當我新插入一個節點$elem時,新節點並沒有綁定click事件。

live()就具備這樣的功能。


如果你知道事件監聽的話就知道這兩個有什麼區別了。第一個是把事件綁定在元素上,第二個是把事件綁定在document上,通過監聽event.target來判斷是不是你所綁定的事件。這樣有一個好處就是在於,你可以在ajax載入節點的時候不用再載入完之後重新綁定一次,因為你的監聽事件是在document上面。如果用bind的話,那麼當ajax載入dom的時候,新過來的節點是沒有綁定事件的,你還需要重新綁定一次。

另外在jQuery現在的版本裡面,已經不推薦使用live方法了,所有的綁定事件全部統一為$.on,解綁事件統一到$.off


bind() 是直接綁定在元素上,而 live() 是通過冒泡的方式來綁定到元素上。舉兩個應用場景來說明他們的存在:

第一、有一個按鈕,你想要用他來在點擊的時候通過 AJAX 提交 form 的請求。

因為這裡只有一個按鈕,只綁定一次,你並不需要冒泡這種更費力費資源的方式來冒泡到 document 再指定這個元素。

第二、在一個有 20個以上,甚至更多個 li 的 ul 列表中,要讓每一個 li 點擊的時候都去觸發相應函數的時候。

如果給每個 li 都綁定一個 click 事件,這樣是不是很蛋疼?這時通過 live()(當然更好是用 delegate() 這樣的方法,可以指定一個離 li 更近的父節點),其實只在 document 上綁定一次 click() 事件,你省了 19 次綁定。這是多省內存的事。對吧?

另外,有同學說兩個會合起來,看完上面的解釋,你覺得呢?哈哈。場景不同,我們需要選擇不同的方式來解決問題,他們提供出來就是為了方便這種不同場景的應用,所以不應該被合併,也不會被合併。


前面人已經說過了 live() 和 bind() 的區別了,我補充下,還有個 delegate() 的,小範圍的使用事件代理,用這個性能會比 live() 更好的


不會,兩者功能不是一樣的,live使用了冒泡方式來判斷當前觸發事件的對象,用的場景會少很多,相比bind有性能問題!


可以看看live/delegate的原理。http://www.blogjava.net/Hafeyang/archive/2011/04/19/the_implementation_of_jquery_delegate_and_live.html


live目前應該已經不被官方推薦使用,使用delegate或on吧


發現bind在谷歌Chrome下還有一個bug,換成on就好了。該bug僅存在於Chrome 57版,現象是bind失效。


javascript 阻止事件繼續執行--冒泡行為控制 -

http://www.suchso.com/projecteactual/javascript-event-up-stopPropagation-cancelBubble.html


live()對新插入元素進行事件綁定


別再用.live了,jQuery1.9已經刪除了live api,推薦大家用.on()掛載事件處理函數


粗淺的認為:給a元素bind()一個事件b後,dom又動態添加了一個a元素,這時候bind()到前一個a元素上的事件就出發不了。需要用到live()


live()是jQuery 1.3中新增的方法。給所有當前以及 將來 會匹配的元素綁定一個事件處理函數(比如click事件)。也能綁定自定義事件。重點突出 「將來」。

live()函數給所有當前以及將來(將來:可理解為用過ajax,js等插入的元素)會匹配的元素綁定一個事件處理函數。

與bind()不同的是,live()一次只能綁定一個事件。


有一個叫livequery的插件,解釋了bind與live的區別。


1.bind 是對具體的元素綁定具體的事件;

2.live,或者 delegate 是事件代理模式,在動態生成的將來元素中用bind 需要恰當的時機,而用代理則避免這個模式。還有代理會更高效。


推薦閱讀:

?基於asp.net,jquery,bootstrap的web應用開發是明智的選擇嗎?
為什麼一些大公司願意無償提供CDN服務?
AJAX載入了HTML但是HTML裡面的CLICK事件無效?
jquery怎麼樣才能算精通,有哪些高級視頻教程,有推薦的嗎?

TAG:前端開發 | jQuery |