2009-07-30 128 views
5

我佈線啓動腳本上的Page_Load JavaScript函數火,像這樣:document.readyState ==「complete」始終爲false。狀態始終是「互動」

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

這個函數調用了幾個不同的功能設置頁面。其中一項功能會檢查document.readyState並確保它是"complete"。這涉及圖像,我想確保一切都已完全呈現。

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

一切工作正常,直到我需要寫一個字節數組的OutputStream(使用Response.BinaryWriteResponse.OutputStream.Write()給一個文件給用戶。在此之後,document.readyState始終是「互動」,直到我瀏覽我已經使用了setTimeout(myFunction, 1000);調用,如果document.readyState是遞歸調用該函數,直到它完成。它永遠不會達到「完成」。

我已經研究了自己很長一段時間,並且無法弄清楚這種行爲。關於如何發生的任何想法?

+0

您是在服務器端還是客戶端運行腳本。如果你在服務器端運行腳本,那麼這是正常的,因爲它一直在等待你的腳本完成。 – BYK 2009-08-04 21:21:52

回答

5

我剛剛發現問題與IFrame,我很抱歉是一個沒有問題的細節。

的更多信息,可以發現here

IE(令人驚訝的得到我這裏 批准投票)有是觸發 每當iframe的readyState的 屬性改變的 onreadystatechange事件。該readyState 反映了在 過程中下載的位置。

內聯:當您最初設置iFrame元素的src 值時, readyState更改爲加載。當 文件已完全下載時, readyState更改爲交互式。 IE和其他瀏覽器的 之間的最大區別在於,當頁面(或應用程序)爲 完全加載並準備好供用戶使用時,IE會將readyState屬性更改爲 以完成 。

附:此相同的行爲 到IE,的在線情況,但 readyState屬性不會改變,以 完成。這不會使 意義,因爲用戶必須手動 通過雙擊它打開該文件 或打開它從一些應用程序。

5

爲了使ReadyState翻轉爲Complete,服務器端必須終止連接。

如果你看看你的代碼,你可能不會在BinaryWrite或WriteToStream方法後調用Response.End。這是必要的,以便刷新響應並提醒客戶端已經傳輸了所有內容。

請注意,您仍然可以在進行Response.End調用之後處理數據服務器端,您不能再向客戶端發送更多數據。

如何正確執行此操作的一個很好的示例是使用C#掌握ASP.Net的A. 171頁。使用A. Russell Jones(google preview here)。

它的核心是你應該創建你的流,將它讀入Byte數組,關閉流,然後做一個BinaryWrite,最後調用Response.End。

+0

我在寫出文件後調用Response.End。在Response.End之後會嘗試發送更多數據給客戶端嗎? – 2009-08-04 13:32:33

+0

也許..但是,我相信Response.End會關閉與瀏覽器的連接。所以任何發送更多數據的嘗試都會失敗。這就是說,不要這樣做。 ;) – NotMe 2009-08-05 00:34:00

0

您是否試過撥打Response.Close()而不是Response.End()?在Reflector中比較它們之後,它們看起來會有所不同。

0

當直接寫入流時,應該將內容長度http標頭設置爲正在發送的二進制數據的正確大小。 這可能也是一個內容類型(multipart/...)的問題,它可能會混淆瀏覽器。