2012-03-03 55 views
2

我有一個鏈接將動態內容加載到一個div中......在新加載的動態內容中需要大量額外的ajax操作。我是否必須爲我的成功處理程序中的每個操作創建新的委託函數? (委託函數是否理想地屬於成功處理程序?)如何合併這些函數?不知道我很理解jQuery代理

例如,我點擊主屏幕上的「查看帖子」按鈕。它將一堆帖子加載到模態窗口中。例如,在該窗口中,每個帖子可能會有一個「查看評論」按鈕,這會讓自己的ajax調用並直接將評論加載到模式窗口中。

我想澄清的兩件事是組織這些委託函數的最佳做法。其次,何時需要委託/什麼時候不需要?

編輯:謝謝你們。這些都是很好的答案。我要選擇Ohgodwhy的答案,因爲他只有245個代表。

回答

3

有一個偉大的參考jQuery的委託功能位於jQuery的文檔中找到 - >http://api.jquery.com/delegate/

代表監測「父」和適用的功能,允許在所有子元素的回調,而不管他們是否'動態與否。

$("table").delegate("td", "click", function(){ 
    //All actions to be performed regardless if dynamic or not. 
}); 

重要的是要注意的是委託功能已被替換爲jQuery 1.7中的.on函數。您可以使用.on功能監視所有DOM更改,這也是替換.live功能。

正確的語法來監控和確保功能綁定到/加DOM加載之後的所有元素就是 - >

$("table").on("click", "td", function(){ 
    //perform actions here for the click functions 
}); 

編輯

如果你想定位的所有標籤s的一類「喬治」,並確保功能運行在所有當前和將來加載,那麼你會做

$(".modal_overlay").on("click", ".george", function(){ 
    alert('I have a class of George'); 
    //every item with a class of george when clicked will alert this. 
}); 

這應該是有道理的。

+0

所以我會把on或delegate函數放在我的腳本的頂部,它也會影響頁面上新加載的內容?所以在我的情況下,我將內容加載到'.modal_overlay'中...我會在腳本的頂部創建一堆$('。modal_overlay')。委託函數嗎? – ThinkingInBits 2012-03-03 00:50:53

1

這個想法是總是委派一個靜態父。所以不管有多少嵌套的動態元素的你,如果你的容器,讓我們說的<article>,你會做這樣的事情:

$('article').on('click', '.view-comments', function(){ 
    // Something 
}); 

所有.view-comments按鈕<article>內和今後的將有click()事件無關的深度。

+0

好的,但你錯過了問題的第二部分。 – ThinkingInBits 2012-03-03 00:44:49

+0

您的意思是_...何時需要委託/何時不需要_? – elclanrs 2012-03-03 00:53:42

+0

不,關於如何組織函數的部分/它們在腳本中的位置。感謝您的答覆,但給了它一個投票。 – ThinkingInBits 2012-03-03 00:57:54

1

這都是關於事件冒泡的。考慮下面的HTML結構:

<body> 
    <div> 
     <p> 
      Here's a 
      <a>link</a> 
      and 
      <a>another</a> 
     </p> 
    </div> 
</body> 

如果你點擊了「另一個」鏈接,你實際上點擊<a><p>,該<div><body>標籤太多,因爲他們是嵌套在彼此的內部。這是.delegate利用動態添加內容簡化事件的原因。比方說,您將委託事件到<div>元素:

$('div').delegate('a', 'click', doSomething); 

這意味着,當點擊事件冒泡到div,它會檢查相同的單擊事件是否<a>元素「鼓泡」內部自身,如果所以,然後運行處理程序。這裏的好處顯然在於,這個div的內容可以是動態的,並且可以在添加委託之後進行修改,因爲只有在事件被觸發時纔會檢查選擇器。

+0

假設我正在將我的內容動態加載到'.modal_overlay'中......我會在頁面頂部創建一堆委託函數嗎?或者在ajax成功處理程序中?例如,我會做$('。modal_overlay).delegate('。view_comments',click',function(){})? – ThinkingInBits 2012-03-03 00:47:13

+1

@ThinkingInBits是的,完全正確。一般來說,你應該將你的委託函數附加到不會改變的元素上。也就是說,無論您的動態內容的容器是什麼。 – nickf 2012-03-03 00:49:47