2012-08-03 8 views
5

Deshalb möchte ich einige JavaScript-Funktion nach meinem Update aktualisiert laufen, also ich habe:Warum wird meine Funktion mehrmals nach Update ausgeführt wird geladen

function pageLoad() { 

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


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

Mit dem obigen Code, wenn ich die Platte eine Aktualisierung Zeit, "Foobar" wird einmal alarmiert werden; Wenn ich das Panel das zweite Mal aktualisiere, erscheint "foobar" zweimal; das dritte Mal trigger ich das Panel zu aktualisieren, "Foobar" tauchte dreimal auf ... 4. Mal Pop 4 mal so und so weiter ....

Was verursacht das ??

Dank ~~~

+1

Sieht so aus, als würden Sie es immer wieder in lprm.add_pageLoaded (panelLoaded) hinzufügen l. Es wird wahrscheinlich nie aus prm entfernt und jedes Mal, wenn Sie die Seite laden, wird eine neue Instanz hinzugefügt. Versuchen Sie, dort einen Haltepunkt zu setzen und zu sehen, wie viele panelLoaded-Aufrufe in prm sind. Hat Prm eine remove_pageLoaded(); Möglichkeit? – Sam

+0

Danke, Sie sind direkt vor Ort, es ist Sys.WebForms.PageRequestManager.getInstance(). Remove_pageLoaded (panelLoaded); – eastboundr

+0

Gut zu helfen! Viel Glück mit dem Rest Ihres Projekts. – Sam

Antwort

1

Vielen Dank, Problem scheinen zu viele prm Instanzen wie Sam erwähnt. Ich habe Sys.WebForms.PageRequestManager.getInstance() hinzugefügt. Remove_pageLoaded (panelLoaded); nach der Warnung() und alles ist gut.

3

Dies liegt daran, pageload als auch während des Updatepostbacks ausgeführt wird. Es gibt eine einfache Lösung:

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

Dies ist, was passiert. pageLoad funktioniert grundsätzlich als eine Kombination von Application.Init und PageRequestManager.EndRequest. Das heißt, es funktioniert auf Application Initialization (etwa DOM Ready) und auf jedem Partial PostBack

So funktioniert pageLoad auf alle PostBacks; voll und teilweise.

Jetzt binden Sie das pageLoaded-Ereignis erneut in die ScriptManager-Instanz bei jedem teilweisen Postback ein, das dieses Verhalten erneut verursacht.