2009-07-30 64 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/...)的问题,它可能会混淆浏览器。