2009-03-02 11 views

risposta

40

Un paio di cose da notare prima. MS ha inventato una sorta di "oggetto runtime clientide" chiamato Sys.Application. Gestisce alzando init, load, e unload eventi in tutto il [clientside] durata della pagina, come segue:

  1. Sys.Application.initialize() inizia la parte init del ciclo di vita. Questo initialize() s tutti i controlli lato client AJAX, dopo di che sono pronti a interagire con programmaticamente
  2. Sys.Application inizia la parte load del ciclo di vita, chiamando tutti i gestori che hanno sottoscritto questo evento
  3. Infine, si chiama il mondiale funzione pageLoad (se definita)

Fase 2) e 3) si ripetono per ogni esempio AJAX UpdatePanel +) postback (parziale.

Così alla fine la risposta: pageLoad è solo una scorciatoia utile per Sys.Application.add_load().

Per quanto riguarda la sua relazione con window.onload tuttavia, le cose iniziano a diventare interessanti. Essenzialmente, MS aveva bisogno di window.onload per sparare solo dopo la la fase init era completa. Ma non puoi controllare quando il browser sparerà onload, poiché è collegato a "contenuto caricato". Questo è noto come "the window.onload problem":

generato l'evento onload dopo tutto pagina di contenuto ha caricato (comprese le immagini e altri contenuti binario). Se la tua pagina include molte immagini, è possibile che visualizzi un ritardo notevole prima che la pagina diventi attiva.

Quindi, hanno appena inventato la propria funzione "speciale" al fuoco al momento giusto nel loro ciclo di vita dell'evento e lo ha chiamato "pageLoad". E il trucco che hanno utilizzato per il kickoff del ciclo di vita di questo evento personalizzato è stato place the call to Sys.Application.initialize() just before the closing </form> tag. Il runtime serveride fa questo. I lettori più attenti noteranno che questo trucco ha permesso a MS di risolvere il problema , poiché qualsiasi codice inserito in pageLoad verrà attivato indipendentemente dal contenuto binario (w/ one rare catch for IE).

> Si comportano allo stesso modo?

Concettualmente sì, in pratica per niente a causa di detto problema . L'unica regola è che devi inserire il codice che interagisce con i tuoi controlli AJAX solo nel pageLoad, poiché window.onload segue la propria traiettoria dell'evento.

> Oppure uno è chiamato prima dell'altro?

Sono completamente indipendenti al 100%.

> Oppure uno si chiamerà automaticamente e l'altro no?

Saranno entrambi chiamati se li avete definiti.

+1

la tua risposta è completa, ma ho un altro problema con pageLoad, quando ho messo nella mia pagina ho scoperto che continua a chiamare e chiamato automaticamente, nota: ho telerik: RadAjaxManager sulla pagina, quindi questo è a causa di un errore sta accadendo o è normale chiamarsi così "come viene chiamato da un timer"? –

+1

nice write up +1 - la soluzione è così molto ridicolmente microsoft – annakata

+0

@amrelgarhy: vedere la mia risposta aggiornata: Passaggio 2) e 3) sono richiamati su ogni postback parziale (ad esempio AJAX + UpdatePanel). –

Problemi correlati