尝试为表单上传制作进度条(旧的 HTML4 表单上传,而不是新的 HTML5 API)。进度实际上跟踪文件移动后正在完成的其他工作。它的设计方式是流保持打开状态,直到完成额外的工作,然后服务器端方法最终返回,从而关闭流。
我遇到了一些特定于 Chrome 的问题。我也有一个可行的实现,但我希望能得到“更好”的东西。
对于任何可能要求提供代码的人:故意不在这里。场景解释了问题;代码本身没有“错误”,只会更加混乱。
简而言之,第 1 次尝试失败
- 启动表单上传
- 在获取某些 JSON 中的进度的 Ajax 调用上设置间隔
- 将数据渲染到进度条
失败原因:上传流阻塞了页面上的其他活动,并且您在传输过程中无法进行额外的 Ajax 调用。
简而言之,第 2 次尝试失败
- 创建一个包含相同 Ajax 调用的 iFrame
- 将数据渲染到 iFrame 中的元素(所需的一切都是自包含的,至少不引用“顶部”文档)
结果:
在启动表单上传之前,我可以从 JSON 呈现“状态:等待”。渲染函数还增加了一个计数器,所以我会看到“尝试#X”。状态等待时,尝试次数会增加。
传输启动后,Ajax 调用成功获得 200,我可以检查响应以查看 JSON 确实存在。
但是,我无法更新 iFrame 中的“shadow DOM”(这是正确的术语吗?)。尝试访问 iFrame 中的节点并对其进行修改失败。甚至计数器也没有增加。
传输完成后,它将成功呈现“状态:完成”并且计数器会向前跳(计数器正在递增,但将其呈现到 iFrame 只是不起作用)
GRR!
成功的尝试
iFrame 不再请求 Ajax。iframe 的 src 属性设置为返回预渲染进度条的 URL。正在加载到 iframe 中的文档设置为重新加载自身。因此,在规定的时间间隔内,它会重新渲染一个“移动”的新进度条。
结果是一个“工作”进度条,尽管有时请求中的滞后会导致 iframe 在一瞬间变为空白,这不是我的偏好。
谁能想到更好的方法来做到这一点?是否有可能我可以让 iFrame 中的表单本身和 Ajax 在“顶部”文档中工作?
我主要想把表现层和数据层分开,但是只要我必须返回一个渲染的进度条,那是行不通的。作为奖励,如果我能找到一种通过 Ajax 更新进度条的方法,我就不会有那些“空白”光点。