2011-05-18 42 views
5

我有一個網格,並且有一列包含<a>錨標記,其中包含<data-..>標記中的一些附加信息,並且有一個類名<class='myspeciallink'>。在我不顯眼的JS腳本中,我選擇了具有該類名稱的所有元素並應用live('click')。我需要這是live(),因爲網格是在運行時生成的。live('click')and performance

live('click')處理程序中,會發生什麼?我使用這些附加數據,並根據該數據向頁面添加<div>。它反過來用於生成jQuery UI對話框。它在我的電腦上效果很好。

但是!這在現實世界中如何工作?我應該爲可能的性能影響而煩惱嗎?我覺得在瞬間應用live()十幾個元素
會影響性能。尤其是像我相當複雜的處理程序 - 它需要獲取數據,分析數據,創建一個div,應用對話等

這是否聞起來像一個糟糕的設計?你能否提出一種不同的方法,或者我的擔憂是沒有根據的?我可以使用某種分析器工具來查找JavaScript中的瓶頸嗎?

UPD:依然沒有人提出任何分析工具。螢火蟲和鉻開發工具是好的,但也許有更好的東西?

+1

你並不需要,要成爲'.live()'。你需要這個'.delegate()'。 – 2011-05-18 15:38:02

+0

你是對的,我不需要傳播冒泡。 – Agzam 2011-05-18 15:50:20

+0

但在我的情況下,我只能做「$(‘身體’)。委託(‘myspeciallink’,‘點擊’」 ......因爲這樣的鏈接,可以放在任何地方 – Agzam 2011-05-18 16:00:42

回答

4

live("click")事實上,從性能的角度來看,事實上更好:不是將事件處理程序綁定到每個匹配元素,而是應用一個事件處理程序,它等待事件冒泡,然後查看觸發的元素該事件匹配選擇器.live被調用。

將此與$('selector').click(...)進行比較,其中的值爲循環遍歷每個元素並綁定一個新的事件處理函數。無論有多少頁面元素與其選擇器匹配,live('click')都沒有額外開銷。根據選擇器匹配的元素數量,使用.live可避免在每個頁面的初始加載期間延遲幾秒鐘。

然而,事件處理程序必須檢查每一個反對它的選擇冒泡事件,以查看是否有匹配。這會爲每次點擊事件添加少量開銷,但很可能您的用戶不會注意到這種差異。

+0

好吧,不一定,如果'click'處理程序停止傳播,那麼I每次點擊都可以節省冒泡,而不用'live',這樣每次點擊都會使'點擊'效果更好,而你的優勢只適用於綁定,而這種綁定是一次性的。 -Micro優化(如起泡,雖然我想)。 – davin 2011-05-18 15:38:59

+0

@davin它可以是一個巨大的儲蓄,這取決於元素的OP的網格有多大。 – meagar 2011-05-18 15:40:51

+1

大規模?聽起來似乎有點言過其實,我只是放在一起包含1000個標籤和綁定點擊處理程序的文檔對他們全部。在平均每檯筆記本電腦上運行10次以上,綁定到所有1000臺計算機的時間爲4ms。沒有比這更快的速度,如果這是一次執行,你幾乎沒有優化任何東西。 – davin 2011-05-18 15:56:51