2012-08-03 6 views
5

Así que desea ejecutar alguna función de JavaScript después de que se actualiza mi actualiza, por lo que tengo:¿Por qué gotea mi función varias veces antes de UpdatePanel está cargado

function pageLoad() { 

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


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

Con el código anterior, si actualizo el panel de tiempo, "foobar" será alertado una vez; Si actualizo el panel la segunda vez, aparecerá "foobar" dos veces; la tercera vez que activé el panel para actualizar, "foobar" apareció tres veces ... 4ta vez pop 4 veces, etc. ...

¿Qué causó esto?

Gracias ~~~

+1

Parece que lo está agregando una y otra vez en lprm.add_pageLoaded (panelLoaded) l. Probablemente nunca se elimine de prm y cada vez que laodice la página, agregará una nueva instancia. Intente establecer un punto de interrupción allí y ver cuántas llamadas de PanelLoaded están en prm. ¿Tiene prm una remove_pageLoaded(); ¿opción? – Sam

+0

Gracias, tiene razón en el momento, es Sys.WebForms.PageRequestManager.getInstance(). Remove_pageLoaded (panelLoaded); – eastboundr

+0

¡Me alegra ayudar! Buena suerte con el resto de tu proyecto. – Sam

Respuesta

1

Gracias a todos, el problema parece ser tener demasiadas instancias de prm como mencionó Sam. Agregué Sys.WebForms.PageRequestManager.getInstance(). Remove_pageLoaded (panelLoaded); después de la alerta() y todo está bien.

3

Esto se debe a pageLoad se ejecuta durante las devoluciones de datos, así UpdatePanel. Hay una solución fácil:

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

Esto es lo que está sucediendo. pageLoad básicamente funciona como una combinación de Application.Init y PageRequestManager.EndRequest. Eso significa que funciona en la Inicialización de la aplicación (aproximadamente DOM Ready) y en cada Partial PostBack

Así que pageLoad funciona en todos los PostBacks; completo y parcial.

Ahora está volviendo a vincular el evento pageLoaded en la instancia de ScriptManager en cada devolución parcial, una y otra vez, provocando este comportamiento.

Cuestiones relacionadas