4

我正在使用 dojo.io.iframe.send 方法将文件发送到我的服务器。我想提供一种方法,用户可以在发送过程中取消发送,以防发送时间过长或用户意识到她发送了错误的文件。

我想不出办法做到这一点。如果发送需要很长时间(即服务器没有快速响应),我可以使用超时来终止发送,但这不是我想要的。我想在用户做出手势时终止(例如单击“取消”按钮。

谢谢!

4

4 回答 4

3

嗨,我意识到这是一个相当晚的回复,所以我希望您或通过谷歌偶然发现这里的人对此有所帮助。

在iFrame 中可以取消文件上传,在 Firefox 中可以调用window.stop()iFrame 上的方法。然而,IE 没有这种方法,但自带了execCommand("Stop")然而,因为手动按下停止甚至不起作用,脚本停止也不会。

我的第一次尝试涉及将 iFrame 的位置设置为about:blank无济于事。但是浏览到具有正文的源将取消iFrame POST!

于 2009-02-03T11:42:15.793 回答
3

出于安全原因,JavaScript 甚至无法访问您发送的文件。所有文件上传都是使用表单完成的,并由浏览器直接处理。据我所知,没有直接的界面来监控上传进度,也没有影响它的方式(例如,取消它)。

导航可能会有所帮助,但是否中断传输仍取决于浏览器——没有关于此的规范。

总结一下:在 JavaScript 中以可移植的方式做到可靠是不可能的。这意味着 Dojo 不提供此功能。

于 2008-11-24T05:03:15.073 回答
2

所以我意识到这是一个非常古老的帖子(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.

于 2012-03-23T15:55:21.377 回答
0

朋友所做的只是在取消按钮被预置时重新加载网页(我认为是通过调用 document.location.refresh 函数)。还有一种监视上传进度的方法(有一个进度条),但它依赖于服务器(在我看到的情况下,它是一个 apache 模块,然后您将轮询指定链接和服务器上的进度将返回进度)。

于 2009-08-17T05:26:45.280 回答