2012-06-18 38 views
1

我有一個UpdatePanel,我用它來替換頁面內的內容。在UpdatePanel之外,我有一些jQuery使用on()函數來分配一些按鈕點擊。根據我的理解,the new jQuery.on() syntax意味着替換兩個事件處理程序和舊的live()功能。 live()函數應該監視對頁面的更改並將事件附加到添加到頁面的任何元素,但這在測試頁面中的on()函數中不會發生。如果我在UpdatePanel更改後打開控制檯並運行相同的函數,那麼事件處理程序將正常工作。jQuery .on()和UpdatePanels

這裏是我的JavaScript明智:

$(function() { 
    $('.results').on('click', function() { 
     $(this).children('.explination').slideToggle(); 
    }); 
}); 

在UpdatePanel是一個簡單的UpdatePanel在它多視圖。

我知道我可以使用Microsoft Ajax PageRequestManager來處理這個問題,但是如果這些事件像我認爲他們應該的那樣綁定,似乎應該是不必要的。我現在將使用它,但我很好奇我是否做得不正確,或者jQuery和ASP.Net是否不在一起工作。

我的一個理論是,無論出於何種原因,UpdatePanel都是一些如何不觸發jQuery正在使用的DOM更新觸發器來捕獲更改並再次觸發on事件。

回答

6

訣竅是使用委託事件。從jQuery文檔中引用:

委託事件的優點是它們可以處理來自稍後添加到文檔中的後代元素的事件。通過選擇在委託事件處理程序附加時保證存在的元素,可以使用委派事件來避免頻繁附加和刪除事件處理程序的需要。

使用委託的事件通過選擇作爲第二個參數,是這樣的:

$('html').on('click', '.results', function() { 
    $(this).children('.explination').slideToggle(); 
}); 
+0

這是一個很好的解決方案。奇怪的是,它沒有監視所添加的元素,沒有初始對象要添加,但我想它會在處理完一個空集合後停止處理。謝謝! – PCasagrande

1

我恨更新面板... EW。也許嘗試是這樣的:

DOM:

<asp:UpdatePanel runat="server"><ContentTemplate> 
    <MultiView>...</MultiView> 
    <script> 
    var prm = Sys.WebForms.PageRequestManager.getInstance(); 
    prm.add_endRequest(function() { 
     ready(); 
    }); 
    </script> 
</ContentTemplate></asp:UpdatePanel> 

jQuery的尼斯:

$(document).ready(function(){ 
     ready(); 
    }); 

    function ready(){ 
     $('.results').on('click', function() { 
     $(this).children('.explination').slideToggle(); 
     }); 
    } 
+0

這與我所擁有的相似,並且它確實有效(儘管對於我而言,我沒有將該腳本放入UpdatePanel中),但似乎應該沒有必要。 – PCasagrande