我正在使用 dojo.io.iframe.send 方法将文件发送到我的服务器。我想提供一种方法,用户可以在发送过程中取消发送,以防发送时间过长或用户意识到她发送了错误的文件。
我想不出办法做到这一点。如果发送需要很长时间(即服务器没有快速响应),我可以使用超时来终止发送,但这不是我想要的。我想在用户做出手势时终止(例如单击“取消”按钮。
谢谢!
嗨,我意识到这是一个相当晚的回复,所以我希望您或通过谷歌偶然发现这里的人对此有所帮助。
在iFrame 中可以取消文件上传,在 Firefox 中可以调用window.stop()
iFrame 上的方法。然而,IE 没有这种方法,但自带了execCommand("Stop")
然而,因为手动按下停止甚至不起作用,脚本停止也不会。
我的第一次尝试涉及将 iFrame 的位置设置为about:blank
无济于事。但是浏览到具有正文的源将取消iFrame POST!
出于安全原因,JavaScript 甚至无法访问您发送的文件。所有文件上传都是使用表单完成的,并由浏览器直接处理。据我所知,没有直接的界面来监控上传进度,也没有影响它的方式(例如,取消它)。
导航可能会有所帮助,但是否中断传输仍取决于浏览器——没有关于此的规范。
总结一下:在 JavaScript 中以可移植的方式做到可靠是不可能的。这意味着 Dojo 不提供此功能。
所以我意识到这是一个非常古老的帖子(4 年!),我正在回答。但是,当我在谷歌上搜索一个回想起来应该很明显的答案时,我发现了它,但在这里没有得到答案(也没有在我看过的其他任何地方)。所以,为了下一个可怜的 schlub:
如果(像我一样),您不关心实际停止文件传输,而只是想允许dojo.io.iframe
继续移动(从用户的角度有效地取消),您可以简单地忽略延迟回调的结果。但是,如果您还想通过 上传其他内容dojo.io.iframe
,则还必须使其dojo.io.iframe
也忽略结果。要做到这一点,这很烦人……dojo.io.iframe.send()
调用返回延迟。如果您想取消上传以便dojo.io.iframe
执行后续排队的发送调用(因为它一次只能执行一个),您只需调用.cancel()
从当前正在进行的发送返回的延迟。
如:
var dfd = dojo.io.iframe.send({...});
var dfd2 = dojo.io.iframe.send({...}); // this send will not start until the first one completes. it is blocked internally by dojo.io.iframe.
...
现在,用户在某处单击取消按钮,因为上传时间太长,或者他们意识到他们并不是要上传所选文件。我们不想等到第一个文件传输完成,因为我们不再关心传输结果。
onclick: function() {
dfd.cancel();
}
在 dfd 上调用 cancel 将允许第二个send()
调用立即执行。如果您在 fiddler 中观看,您会看到第二次上传现在立即开始,而不是等待第一个(已取消)上传完成,因为它会在不调用.cancel()
deferred 的情况下完成。
在不取消第一次延迟的情况下,dojo.io.iframe
将继续尽职尽责地等待第一次上传的结果,从而阻止任何后续排队send()
等待通过dojo.io.iframe
.
朋友所做的只是在取消按钮被预置时重新加载网页(我认为是通过调用 document.location.refresh 函数)。还有一种监视上传进度的方法(有一个进度条),但它依赖于服务器(在我看到的情况下,它是一个 apache 模块,然后您将轮询指定链接和服务器上的进度将返回进度)。