2012-04-09 81 views
2

我正在使用jQuery將函數附加到整個類的單擊事件中。例如:使用類選擇器附加事件處理程序是否會影響該類的動態添加元素?

$(".clickDiv").click(function(){ 
    $(this).hide(); 
}); 

在我的客戶端JavaScript,我動態地創建更.clickDiv實例。
我是否需要再次調用$(".clickDiv).click(function...),或者新實例是否會自動將該函數綁定到click事件?

+1

不,我沒有類似的東西,但新的情況下,並沒有自動綁定,我讓他們使用.live()函數進行綁定。您可以在jQuery網站上查看http://api.jquery.com/live/。 – anuragsn7 2012-04-09 03:06:00

+1

@ anuragsn7。用'live'就夠了!閱讀我更新的答案。過多的人正在使用遺留代碼... on,on,on,on,on,on,on,on,on,on,on, 'on','on','on','on' ** !!! ** – gdoron 2012-04-09 03:27:01

回答

6

是的,你做什麼,除非你使用一個delegate event

這樣的:

$('#container').on('click', '.clickDiv', function() { 
    $(this).hide(); 
}); 

ondocs

如果選擇省略或爲空,事件處理程序被稱爲直接或直接綁定。每次在選定元素上發生事件時,都會調用處理程序,無論它是直接發生在元素還是來自後代(內部)元素的氣泡。

當提供選擇器時,事件處理程序被稱爲委託。當事件直接發生在綁定元素上時,不會調用該處理程序,而只會爲與選擇器匹配的後代(內部元素)調用該處理程序。 jQuery將事件從事件目標引發到處理程序所附的元素(即,最內層到最外層的元素),並沿着匹配選擇器的路徑上的任何元素運行處理程序。

事件處理程序僅綁定到當前選定的元素;它們必須在代碼調用.on()時存在於頁面上。爲確保元素存在且可以選擇,請在文檔就緒處理程序中爲頁面上HTML標記中的元素執行事件綁定。如果將新的HTML注入頁面,請在將新的HTML放入頁面後選擇元素並附加事件處理程序。或者,使用委託事件來附加事件處理程序,如下所述。

委託事件的優點是它們可以處理來自稍後添加到文檔中的後代元素的事件。通過選擇在委託事件處理程序附加時保證存在的元素,可以使用委派事件來避免頻繁附加和刪除事件處理程序的需要。該元素可以是模型 - 視圖 - 控制器設計中的視圖的容器元素,例如,如果事件處理程序想要監視文檔中的所有冒泡事件,則可以是文檔。在加載任何其他HTML之前,文檔元素在文檔的頭部可用,因此在不等待文檔準備就緒的情況下在其中附加事件是安全的。


只是因爲這裏太多人建議你應該使用liveliveon因爲1.7版本過時,通過delegate

$(selector).live(events, data, handler);    // jQuery 1.3+ 
$(document).delegate(selector, events, data, handler); // jQuery 1.4.3+ 
$(document).on(events, selector, data, handler);  // jQuery 1.7+ 
+0

謝謝,這是一個很好的答案!我會詳細閱讀委託活動。 – steve8918 2012-04-09 03:19:44

+2

+1很好的答案,感謝您將我的注意力(這是'.live'已棄用 - 我一直在使用它)。但我不會很快改變它(正如我在其他答案中的評論中所說的那樣) – Nathan 2012-04-09 03:24:38

+0

我使用jQuery中非常有限的函數,因此我一直在使用較早版本的jQuery很長一段時間。感謝這個有用的信息。 – anuragsn7 2012-04-09 03:41:12

0

1.4.3版本取而代之的將事件綁定所有新實例

$('.clickDiv').live('click', function() { 
    $(this).hide(); 
}); 

http://api.jquery.com/live/

+4

NOOOO !!!不再「活着」!它已被棄用,不應該從jQuery 1.4.4開始使用! – gdoron 2012-04-09 03:10:53

+1

@gdoron其實:從jQuery 1.7開始,.live()方法已被棄用。使用.on()附加事件處理程序。「你從哪裏得到」自1.4.4「起? – Nathan 2012-04-09 03:18:58

+0

@Nathan。請閱讀我更新的答案。 – gdoron 2012-04-09 03:22:02

1
I am attaching an event like : 

$('body').on('click', 'button[data-tracking], a[data-tracking]', 

       function(event) { console.log($(event.target)); 
}); 

and want to get to the target of element which is set up as : 
    <pre> <[]a data-tracking="hello" href="hello"> 
    \<\span\>test now\<\/span\> 
    \<\/a\> 
</pre> 
it does work perfectly, but event.target gives me "span" element but what i want is "a" element so that I could get to value of data-tracking attribute. 
相關問題