2012-02-07 28 views
3

我使用AJAX更新容器。在性能方面哪個更好?僞代碼:哪個更好,刷新後還是live()(jQuery)?

$.post('get_something.php',function(data){ 
    $('#container').html(data).find('a').bind('click',function(){ 
     console.log('Doh!'); 
    }); 
}); 

或者這個?

$('#container a').live('click',function(){ 
    console.log('Doh!'); 
}); 

$.post('get_something.php',function(data){ 
    $('#container').html(data); 
}); 
+0

第一個腳本 – mgraph 2012-02-07 12:43:06

+2

組合使用的第二與'上()'。建議並在性能最好使用'上()'代替'綁定()'和' live()'from jQuery 1.7 - http://api.jquery.com/on/ – MarkSmits 2012-02-07 12:43:43

+0

如果有一個控制的數量,比如說1-5,不更新的元素,那麼'bind()'優先?這個事件會在沒有在DOM周圍徘徊的情況下被觸發? – 2012-02-07 13:00:45

回答

6

首先,我不建議使用live所有(與jQuery開發團隊已經過時的話)。我會使用delegate(或新版本的on)與一個更具針對性的容器(在您的情況下,#container)比整個文檔。

如果你這樣做,在點擊時性能會如此接近相同,以使沒有什麼區別(我們這裏處理用戶生成的事件,奇額外的幾毫秒不做沒關係) 。

雖然還有其他考慮(嗯)考慮。假設我們有這樣的標記:

<div id="container"> 
    <div id="wrapper"> 
     <a>A link</a> 
    </div> 
</div> 

...這代碼:

$("#container").delegate('a', 'click', function() { 
    // Do something with the click 
    console.log("Link was clicked"); 
}); 
$("#wrapper").click(function() { 
    return false; 
}); 

由於a是最深的元素,你會期望在a點擊由第一處理處理程序並查看console.log條目。但是你不會,因爲點擊實際上沒有被處理,直到到達容器  —並且在這種情況下,它不會到達容器,因爲它們之間的包裝元素停止事件。

這不是負面的(我發現delegate非常有用並且一直都在使用它),這只是在您設計您如何處理事情時需要考慮的事情。

+0

什麼時候只有一個元素?即使是那樣,bind()很糟糕? – 2012-02-14 09:47:18

+0

@MarttiLaine:我不認爲我說bind是壞的。 - )我的觀點是,任何一種方法都非常好,而你在點擊響應時間內不太可能看到任何實際差異。所以要麼在回調中使用'bind',要麼使用'delegate'(或者'on'的委託特性),無論你喜歡什麼,即使只有一個元素。 – 2012-02-14 10:01:13

2

這兩個,第一個選項。然而,除了他們兩個更好的是delegate()

$("#container").delegate(".filter", "click", function() { 
    // do something on click of .filter element. 
}); 
1

FYI它指出

「畢竟,綁定顯得那麼更清晰,更直接,沒有它那麼,有2個原因,我們傾向於委託或活綁定:

  • 由於綁定直接綁定處理程序到單個元素,因此它不能將它們綁定到尚未在頁面上的元素,如果你是 運行$( 'a')。bind(...),然後將新的鏈接添加到通過AJAX頁面 ,您的綁定處理程序將不適用於這些。另一方面,代理另一方面綁定到另一個祖先節點,所以它 將工作任何元素現在或將來在那個 祖先元素內存在。

  • 或一個處理程序附加到一個單一的元素或小羣 元件,監聽的後代元素的事件,而不是 循環通過並且將相同的功能,以在DOM 100個單獨 元件。這將是 將處理程序附加到一個(或一小組)祖先元素 的性能優勢,而不是直接將處理程序附加到頁面上的所有元素。 「

answer source

相關問題