2013-01-14 91 views
0

有沒有什麼辦法可以使用jQuery來委託一個事件,它將對應於頁面上與選擇器匹配的所有元素,而不是從$(document)中委託?1.7.2中的jQuery事件委託

因爲這可能是措辭不當,這裏的難題是:

曾經有jQuery.live下放事件,以匹配選擇的所有元素。這被替換爲jQuery.delegate,它將特定上下文選擇器中的事件委託給它的子項,而後者又被jQuery.on取代,後者實際上做了同樣的事情,但在幕後有不同的位(我想象中)。

我想要做的就是安全地爲我的頁面上的每個div.foo添加一個事件處理程序,而不管它可能存在的位置或存在的時間。根據文檔和實證研究,以下內容僅與腳本運行時存在的.foo元素綁定。由於有代碼可能會在頁面上放置一個.foo元素,所以這不正確。

jQuery('.foo').on('click', handler); 

由於live被棄用(可能已經刪除的?),我試圖不使用,但唯一的解決辦法,我能想出是

jQuery(document).on('click', '.foo', handler); 

但是這是否有什麼live原來,在幕後?更重要的是,有沒有什麼重要的原因不是要做到這一點?

我們特別使用1.7.2版,但通用的jQuery答案也會有所幫助。

+0

這是'live'最初做的,但它也正是你要找的。理想情況下,你會使用'document'以外的其他東西,但是如果你不能縮小它,那麼'document'是你唯一的選擇。 –

+0

@詹姆斯蒙塔涅耶我懷疑這一點。我只是不知道是否有理由不把它委託給文檔,除了可能阻止'stopPropagation'。 –

+1

也表現。它必須一直冒泡,頁面上的每次點擊都會被捕獲並檢查,看看它是否是正確的選擇器。 –

回答

1

事件從源頭冒泡到他們委派的任何東西,所以您應該在最常見的父級上使用jquery()。如果這是文件,那就這樣吧。如果你的.foo項目總是在.foocontainer(或其他)中創建,那麼你可以在你的選擇器中使用它,即使它們中有多個 - 你只需要連接。

我認爲委託迴文檔的問題是它可能需要事件冒泡很多次,在流程中產生額外的開銷,所以最好儘可能將事件委託給源代碼。

1

你處於一個結合到文件(如下)正確正是live()做:

jQuery(document).on('click', '.foo', handler); 

其原因,這是不好的,因爲它不是非常高性能的。每當您單擊任何地方時,document都會檢查它是否位於委託元素上。

更好的方法是使用元素代替document,這是最接近動態追加的元素的父元素,但可在頁面加載時使用。即使這是頂級容器,它仍然會提供性能優勢,而不是將所有內容都附加到document