2012-08-03 3 views
5

quindi voglio correre qualche funzione javascript dopo il mio UpdatePanel viene aggiornato, in modo da avere:più volte Perché la mia funzione eseguito dopo UpdatePanel è caricato

function pageLoad() { 

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


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

Con il codice di cui sopra, se aggiorno il un pannello tempo, "foobar" sarà avvertito una volta; Se aggiorno il pannello la seconda volta, "foobar" apparirà due volte; la terza volta che faccio scattare il pannello per aggiornare, "foobar" è apparso tre volte ... 4a volta pop 4 volte e così via ...

Che cosa ha causato questo ??

Grazie ~~~

+1

Sembra che lo si aggiunga più e più volte in lprm.add_pageLoaded (panelLoaded) l. Probabilmente non viene mai rimosso da prm e ogni volta che si sta tagliando la pagina si aggiunge una nuova istanza. Prova a impostare un punto di interruzione lì e vedere quante chiamate panelLoaded sono in prm. Prm ha un remove_pageLoaded(); opzione? – Sam

+0

Grazie, sei proprio sul posto, è Sys.WebForms.PageRequestManager.getInstance(). Remove_pageLoaded (panelLoaded); – eastboundr

+0

Felice di aiutare! Buona fortuna con il resto del tuo progetto. – Sam

risposta

1

Grazie a tutti, il problema sembra avere troppe istanze di Prm come Sam ha detto. Ho aggiunto Sys.WebForms.PageRequestManager.getInstance(). Remove_pageLoaded (panelLoaded); dopo l'avviso() e tutto è buono.

3

Questo perché Pageload viene eseguito durante postbacks UpdatePanel pure. C'è una soluzione facile:

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

Questo è ciò che sta accadendo. pageLoad fondamentalmente funziona come una combinazione di Application.Init e PageRequestManager.EndRequest. Ciò significa che funziona su Application Initialization (approssimativamente DOM Ready) e su ogni Partial PostBack

Quindi pageLoad funziona su tutti i PostBacks; pieno e parziale.

Ora si associa di nuovo l'evento pageLoaded all'istanza di ScriptManager su ogni postback parziale, causando di nuovo questo comportamento.