2012-08-03 37 views
5

所以我想運行一些JavaScript函數我的UpdatePanel更新後,讓我有:的UpdatePanel後爲什麼我的函數運行多次被加載

function pageLoad() { 

    var prm = Sys.WebForms.PageRequestManager.getInstance(); 
    prm.add_pageLoaded(panelLoaded); 
} 


function panelLoaded(sender, args) { 
     alert("foobar"); 
} 

與上面的代碼,如果我更新面板一個時間,「foobar」會一次提醒;如果我第二次更新面板,「foobar」會彈出兩次;第三次觸發面板更新,「foobar」彈出三次...第四次彈出4次等等......

是什麼引起的?

謝謝~~~

+1

看起來像在lprm.add_pageLoaded(panelLoaded)中一遍又一遍地添加它l。它可能永遠不會從prm中刪除,並且每次你在添加一個新實例的頁面都會丟失。嘗試在那裏設置一個斷點並查看prm中有多少個panelLoaded調用。 prm是否有remove_pageLoaded();選項? – Sam 2012-08-03 20:24:26

+0

謝謝你,你是對的,它是Sys.WebForms.PageRequestManager.getInstance()。remove_pageLoaded(panelLoaded); – eastboundr 2012-08-03 20:42:11

+0

很高興幫助!祝好運與您的其餘項目。 – Sam 2012-08-03 20:45:00

回答

1

感謝所有,問題似乎有山姆提到的太多prm實例。我添加了Sys.WebForms.PageRequestManager.getInstance()。remove_pageLoaded(panelLoaded); alert()之後,一切都很好。

3

這是因爲頁面加載期間的UpdatePanel回發以及執行。有一個簡單的解決方案:

function pageLoad(sender, eventArgs) { 
    // If this is being executed by ajax 
    if (eventArgs) { 
     // And this is only a partial load 
     if (eventArgs.get_isPartialLoad()) { 
      // Don't perform any further processing 
      return; 
     } 
    } 
    var prm = Sys.WebForms.PageRequestManager.getInstance(); 
    prm.add_pageLoaded(panelLoaded); 
} 
0

這就是發生了什麼事。 pageLoad基本上起着Application.InitPageRequestManager.EndRequest的組合作用。這意味着它適用於應用程序初始化(大約DOM Ready)和每個Partial PostBack

因此,pageLoad適用於所有的PostBack;完整和部分。

現在,您再次在ScriptManager的實例上再次綁定pageLoaded事件,每次部分回發會一次又一次導致此行爲。

相關問題