document.readyState =="complete"始终为false.国家总是"互动"

Aar*_*els 5 .net javascript c# vb.net asp.net

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

ScriptManager.RegisterStartupScript(Me, GetType(Page), "page_init", "page_init();", True)
Run Code Online (Sandbox Code Playgroud)

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

if (document.readyState == "complete") {
Run Code Online (Sandbox Code Playgroud)

一切正常,直到我需要将一个字节数组写入输出流(使用Response.BinaryWrite或者Response.OutputStream.Write()向用户提供文件.之后,document.readyState它总是"交互式",直到我离开页面然后返回.我甚至有setTimeout(myFunction, 1000);如果document.readyState没有完成则使用一个调用来递归调用函数直到它完成.它永远不会达到"完成".

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

Not*_*tMe 5

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

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

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

如何正确执行此操作的一个很好的示例是使用C#by A. Russell Jones掌握ASP.Net的第171页(谷歌预览).

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


Aar*_*els 5

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

更多信息可以在这里找到:

IE(令人惊讶地获得我的批准投票)当iFrame的readyState属性发生变化时,会有一个onreadystatechange事件触发.readyState反映了下载过程的位置.

内联:当您最初设置iFrame元素的src值时,readyState将更改为加载.文件完全下载后,readyState将更改为interactive.IE和其他浏览器之间的最大区别在于,IE会在页面(或应用程序)完全加载并为用户准备好时更改readyState属性.

附件:此行为与IE的内联案例相同,但readyState属性永远不会更改为完成.这没有多大意义,因为用户必须通过双击或从某个应用程序打开文件来手动打开文件.