2011-08-11 30 views
5

我的團隊正在使用jQuery Mobile構建移動網站,而且隨着發佈日期的臨近,性能越來越受到關注。我所做的一個觀察是,在我們的代碼中,我們有很多撥打live()delegate()的電話;但事實上,據我所知,我們只是不斷使用這些方法將事件處理程序附加到已經存在的DOM節點(和始終存在,在我們的應用程序的情況下)。bind()比live()和delegate()更快嗎?

鑑於live()delegate()都旨在於在DOM以後可能出現節點提供動態綁定,並考慮到每一種涉及已起泡一路攀升至document根節點處理事件,我想知道是否可以通過將這些電話(如適用)更改爲bind()來改善性能。

我知道,我也許可以在某些方面我自己測試這一點,但我沒有經驗的大量做性能測試使用JavaScript和我想它可能會帶我長於找出這對我來說只是問社區。有沒有人測試過這個?有一個可衡量的差異嗎?或將切換這些live()delegate()調用到bind()是浪費時間嗎?

+0

如您所知,事件可能會發生。live()方法並不關心節點是否出現在DOM後面,或者它從一開始就在那裏,它只是附加一個監聽器來執行「document」全局變量,並偵聽某個事件是否來自適當的對象並觸發功能如果它。至於你的問題:「我們應該忘記小效率,約97%的時間:過早優化是萬惡之源。」 – Mironor

+1

@Mironor:是的,*過早*優化。 –

回答

3

我還沒有測量任何東西,但live可能會比bind快大部分元素,因爲bind需要影響每個元素。

如果你bind事件爲200個元素,jQuery需要循環遍歷所有這些元素,並在每個元素上調用addEventListener
如果live事件200點的元素,jQuery的只是增加了一個單獨的事件處理程序<body>
然而,這意味着,每一個泡到身體活動必須與你有live d各選擇進行測試。

因此,最快的選項應該是delegate到包含儘可能少的(所以它得到了必須對您的選擇進行測試較少的其他事件)

+0

這個推理對我來說很有意義,但我仍然對使用'bind'與'live'或'delegate'和* single * DOM節點的場景感到懷疑。 –

+0

@Dan:如果你只有一個DOM節點,'bind'可能會更快。 – SLaks

+1

'.bind()'的另一個缺點是,如果受影響的元素還沒有事件處理程序,除了共享的實際處理程序之外,jQuery還會在每個元素上創建一個單獨的唯一函數*。因此,如果綁定到200個元素,則會創建和引用201個函數實例。 – user113716

4

這取決於你如何使用它,但該元素委託提供在大多數情況下的最佳性能(不一定在速度僅但總體而言):

http://www.alfajango.com/blog/the-difference-between-jquerys-bind-live-and-delegate/

+0

這解決了(在我看來)像'$('a')。bind(...)'和'$(document).delegate('a',...)'這樣的東西。但我關心的是在包含* single * DOM節點的jQuery對象上調用'bind'的情況。也許我必須自己測試一下,呃? –

+0

如果它是一個單獨的元素,'delegate'和'bind'之間的性能大部分是相同的('bind'可能會稍微快一點)。無論如何,你應該確定你的代碼。 – Mrchief

0

bind用於他直接事件的元素進行綁定。因此,只有在元素存在的情況下才會附加事件,其中livedelegate也用於動態元素。這取決於你的使用,但生活和授權提供更好的性能比bind

2

我做對三個簡單的基準。一般來說,代表是最高效的。例外情況是綁定的元素是靜態的並且已知的。即使有多個靜態元素,綁定始終優於Delegate。綁定確實有更多的初始開銷,但委託有更多的事件時間開銷。

查看我的結果.live() vs .bind()

+0

我很想知道你用來使這些方法相互對抗的代碼。 –

+0

這是一個單一按鈕,其中包含由單個靜態測試的事件處理程序觸發的警報。然後,我只在頁面上放置了多個按鈕,並將每個按鈕與多個靜態的偵聽器綁定在一起。然後我有一個按鈕創建下一個按鈕並動態綁定動態測試。整個時間運行一個分析器來衡量性能和流程。 –