2013-07-03 122 views
5

我有一些JavaScript,我繼承了我的工作。在這個JavaScript中,我們有一個不斷更新的邊欄(每隔1到10分鐘)。在腳本中,我們解析並處理來自服務器的AJAX,然後調用一個有趣的函數。Javascript事件監聽器刷新

function renewClicks(){ 
    $('.classElem').unbind('click'); 
    $('.classElem2').unbind('click'); 
    $('.classElem3').unbind('click'); 

    $('.classElem').click(elm1funct); 
    $('.classElem2').clikc(elm2funct); 
    $('.classElem3').click(elm3funct); 
} 

其中.classElem是附加到添加到頁面的每個圖像的css類選擇器。而elmfunct是一個用於處理點擊的函數。這會在每次更新時運行(取消授權有效的已添加元素,然後重新添加全部元素)。我想知道是否有一種方法可以將偵聽器附加到DOM中的body元素上,這樣所有添加到頁面中的圖像元素和繼承css類的圖像元素都將被處理,因此不會被註銷,每次更新都註冊。

謝謝你提供的任何信息。

+2

您應該使用委託,使用jQuery的on方法來處理這個問題,以便您不必保持解除綁定/重新綁定這些點擊。沒有看到你的HTML代碼,很難再告訴你更多。 – crush

回答

8

你可以試試這個:

$('body').on('click','.classElem',elm1funct) 
     .on('click','.classElem2',elm2funct) 
     .on('click','.classElem3', elm3funct); 

jQuery's docs

授權事件的優點是他們可以處理事件 後代ele稍後添加到文檔中的內容。通過 採摘這是保證出席 委派的事件處理程序連接時的元素,你可以使用委派事件 避免需要頻繁安裝和取下事件處理程序。

+0

這對於任何給定時間頁面中存在的每個實例都適用?所以,讓我們說我有一個放大鏡圖標,我將它添加到13個div元素。每個放大鏡是否都分配了正確的事件處理程序?我只是想徹底。 –

+0

是通過對''body'','document'或這些元素的祖先應用'.on()',點擊指定的功能將適用於與您的類選擇器匹配的所有元素,甚至是新的元素 – DarkAjax

+0

爲了的性能,委託的事件處理程序應儘可能地附加到目標('。classElem'等)。如果目標'.classElem'將始終位於ID爲myDiv的div內,請使用'(''click','.classElem',elm1funct)''('#myDiv')。 – Sinjai

7

正如@crush提到的,使用事件委託方式,以避免解除綁定並重新綁定事件:

$(document).on('click', '.classElem', elm1funct);