document.readyState == "complete" 总是错误的。状态始终是“交互的”

Posted

技术标签:

【中文标题】document.readyState == "complete" 总是错误的。状态始终是“交互的”【英文标题】:document.readyState == "complete" is always false. The state is always "interactive" 【发布时间】:2010-11-15 13:19:11 【问题描述】:

我在 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 始终是“交互式”的,直到我离开页面并返回。如果document.readyState 不完整,我什至使用setTimeout(myFunction, 1000); 调用来递归调用该函数,直到它完成。它永远不会达到“完成”。

我自己对此进行了很长时间的研究,但无法弄清楚这种行为。关于这是如何发生的任何想法?

【问题讨论】:

您是在服务器端还是客户端运行脚本。如果您在服务器端运行脚本,那么这是正常的,因为它一直在等待您的脚本完成。 【参考方案1】:

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

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

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

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

关键是您应该创建流,将其读入字节数组,关闭流,然后执行 BinaryWrite,最后调用 Response.End。

【讨论】:

写出文件后,我正在调用 Response.End。在 Response.End 之后尝试向客户端发送更多数据会导致这种情况吗? 也许.. 但是,我相信 Response.End 关闭了与浏览器的连接。因此,任何发送更多数据的尝试都应该失败。就是说,不要这样做。 ;)【参考方案2】:

您是否尝试过调用Response.Close() 而不是Response.End()?在Reflector中比较后,会发现两者是不同的。

【讨论】:

有趣。你有没有碰巧追查到有什么不同?【参考方案3】:

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

【讨论】:

【参考方案4】:

我刚刚发现问题出在一个 IFrame 上,我很抱歉,这是一个问题中遗漏的细节。

更多信息可以找到here:

IE(出乎意料地得到了我的投票 在这里批准)有一个 触发的 onreadystatechange 事件 每当 iFrame 的 readyState 属性变化。那个 readyState 反映下载在哪里 过程。

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

附件:这行为相同 对于 IE 的 Inline case,但是 readyState 属性永远不会更改为 完成。 这没什么大不了的 感觉,因为用户必须手动 双击打开文件 或从某个应用程序中打开它。

【讨论】:

以上是关于document.readyState == "complete" 总是错误的。状态始终是“交互的”的主要内容,如果未能解决你的问题,请参考以下文章

javascript 检测document.readyState

document.readyState == "complete" 总是错误的。状态始终是“交互的”

browser.executeScript(return window.document.readyState)未在量角器中得到解决

js中常用方法以及document.readyState 判断页面是不是加载完成 complete和interactive

window.onload和window.document.readystate的探究

如何检测页面加载完成