2009-07-30 13 views
5

Sto cablaggio uno script di avvio JavaScript funzione Page Load al fuoco in questo modo:document.readyState == "complete" è sempre falso. Lo stato è sempre "interattivo"

ScriptManager.RegisterStartupScript(Me, GetType(Page), "page_init", "page_init();", True) 

Questa funzione richiama un paio di funzioni diverse per impostare la pagina. Una di queste funzioni controlla lo document.readyState e si assicura che sia "complete". Questo riguarda le immagini e voglio assicurarmi che tutto sia stato reso completamente.

if (document.readyState == "complete") { 

Tutto funziona bene, fino a quando ho bisogno di scrivere un array di byte al OutputStream (utilizzando Response.BinaryWrite o Response.OutputStream.Write() per dare un file ad un utente. Dopo di che, il document.readyState è sempre "interattivo", fino a quando naviga Ho anche usato una chiamata setTimeout(myFunction, 1000); se document.readyState non è completa per chiamare la funzione in modo ricorsivo finché non è completa.Non raggiunge mai "completo"

Ho cercato questo per un bel po 'di tempo, e non riesco a capire questo comportamento.Qualsiasi idea su come questo sta accadendo?

+0

Si sta eseguendo lo script sul lato server o sul lato client. Se stai eseguendo lo script sul lato server, è normale dal momento che continua ad aspettare che lo script finisca. – BYK

risposta

5

Ho appena scoperto che il problema è con un IFrame, che mi scuso è stato un dettaglio lasciato fuori dalla domanda.

Maggiori informazioni possono essere trovate here:

IE (ottiene sorprendentemente il mio voto di approvazione qui) C'è un evento onreadystatechange che spara ogni volta che il formato iFrame readyState modifiche alle proprietà. Quel readyState riflette dove il download si trova nel processo .

Inline: Quando si imposta inizialmente il valore src dell'elemento iFrame, lo stato readyState viene modificato nel caricamento.Quando il file è stato completamente scaricato, , il readyState diventa interattivo. La grande differenza tra IE e gli altri browser è che IE modifica quindi la proprietà readyState per completare quando la pagina (o l'applicazione) è completamente caricata e pronta per l'utente.

Allegato: questo comporta in modo identico al caso in linea di IE, ma la proprietà readyState non cambia mai per completa. Questo non renderebbe molto senso , poiché l'utente deve manualmente aprire il file facendo doppio clic su di esso o aprendolo da qualche applicazione.

5

Per consentire a ReadyState di passare a Completare, il lato server deve terminare la connessione.

Se si guarda il codice probabilmente non si chiama Response.End AFTER il metodo BinaryWrite o WriteToStream. Questo è necessario per scaricare la risposta e avvisare il cliente che tutto è stato trasferito.

Si noti che è ancora possibile elaborare il lato server dati dopo aver effettuato la chiamata Response.End, non è possibile inviare altri dati al client.

Un buon esempio di come eseguire correttamente questa operazione è pagina 171 di Mastering ASP.Net con C# di A. Russell Jones (google preview here).

Il nocciolo di esso è che è necessario creare il flusso, leggerlo nella matrice dei byte, chiudere lo stream, quindi eseguire una scrittura binaria e infine chiamare Response.End.

+0

Ho chiamato Response.End dopo aver scritto il file. Avrebbe tentato di inviare più dati al client dopo Response.End causare questo? –

+0

Forse .. Tuttavia, credo che Response.End chiuda la connessione con il browser. Quindi qualsiasi tentativo di inviare più dati * dovrebbe * fallire. Detto questo, non farlo. ;) – NotMe

0

Hai provato a chiamare Response.Close() anziché Response.End() o prima? Dopo averli confrontati in Reflector, sembrerebbe che i due siano diversi.

+0

Interessante. Ti è capitato di risalire per vedere quali erano le differenze? – NotMe

0

durante la scrittura diretta nello stream, è necessario impostare l'intestazione http della lunghezza del contenuto sulla dimensione corretta dei dati binari che si inviano. Potrebbe anche essere un problema con il tipo di contenuto (multipart/...) che potrebbe confondere il browser.

Problemi correlati