document.readyState ==“complete”始终为false。国家总是“互动”

时间:2009-07-30 18:20:01

标签: c# .net asp.net javascript vb.net

我在Page_Load上连接启动脚本JavaScript函数,如下所示:

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

此函数调用几个不同的函数来设置页面。其中一个函数会检查document.readyState并确保它为"complete"。这涉及图像,我想确保一切都已完全呈现。

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

一切正常,直到我需要将一个字节数组写入输出流(使用Response.BinaryWriteResponse.OutputStream.Write()向用户提供文件。之后,document.readyState为总是“互动的”,直到我离开页面并返回。如果setTimeout(myFunction, 1000);未完成,我甚至使用了document.readyState调用来递归调用函数直到它完成。它永远不会达到“完成”。

我已经研究过这个问题很长时间了,并且无法弄清楚这种行为。关于这是如何发生的任何想法?

4 个答案:

答案 0 :(得分:5)

为了让ReadyState翻转为Complete,服务器端必须终止连接。

如果查看代码,可能不会在BinaryWrite或WriteToStream方法之后调用Response.End。这是为了刷新响应并提醒客户端已传输所有内容所必需的。

请注意,在进行Response.End调用后,您仍然可以处理数据服务器端,您只是无法向客户端发送更多数据。

如何正确执行此操作的一个很好的示例是A. Russell Jones(google preview here)使用C#掌握ASP.Net的第171页。

它的核心是你应该创建你的流,将它读入字节数组,关闭流,然后做一个BinaryWrite,最后调用Response.End。

答案 1 :(得分:5)

我刚刚发现问题出在IFrame上,我道歉是一个遗留问题的细节。

可以找到更多信息here

  IE(令人惊讶地得到了我的投票   在这里批准)有一个   触发的onreadystatechange事件   每当iFrame的readyState时   财产变化。那个readyState   反映下载的位置   过程

     

内联:最初设置src时   iFrame元素的值,   readyState更改为加载。什么时候   该文件已完全下载,   readyState更改为交互式。   IE和IE之间的巨大差异   其他浏览器是IE然后改变   readyState属性来完成   当页面(或应用程序)是   满载并为用户做好准备。

     

附件:这表现相同   对于IE的内联案例,但是   readyState属性永远不会更改为   完成。那不会太多   感觉,因为用户必须手动   双击打开文件   或从某些应用程序中打开它。

答案 2 :(得分:0)

您是否尝试过Response.Close()而不是Response.End()之前或之前?在Reflector中比较它们之后,看起来两者是不同的。

答案 3 :(得分:0)

直接写入流时,应将内容长度的http标头设置为正在发送的二进制数据的正确大小。 它可能也是内容类型(multipart / ...)的问题,可能会混淆浏览器。