任何方式使表单提交同步?

时间:2014-04-10 21:24:54

标签: javascript html forms synchronous

我需要从服务器下载文件并在客户端上弹出“另存为”框。我无法在Ajax中执行此操作,因此我在客户端JavaScript中创建了一个隐藏的表单,并在单击按钮时在JS中提交表单。服务器获取POST,并将文件作为附件发回,客户端生成“保存”框。

到目前为止,这么好,除了这里有两个问题:

1 - 我希望JS在用户完成下载后删除新创建的表单。我想我可以在DOM中留下一个无用的隐藏形式,但它并不理想。问题是form.submit()异步执行,所以我不知道何时删除表单 - 我不能简单地执行form.submit()

2 - 有时用户实际上需要下载两个文件。此代码不起作用:

form1.submit();   // download file 1
form2.submit();   // download file 2

客户端只执行/完成其中一个提交 - 例如,我可以通过在两者之间放置alert来做到这两点,但我需要正确地完成它。

如果我使用Ajax执行此操作,我只是使调用同步,但我找不到使用表单提交的方法。理想情况下,我想要一个属性来使提交同步(类似.setAttribute('async', false),这不起作用)。

有什么想法吗?或者使用两个另存为对话框下载两个文件的另一种方法是什么?

1 个答案:

答案 0 :(得分:1)

一个很棒的技巧是使用cookie。诀窍就是这样:

  1. 创建您的临时表单,并添加两个您填充的额外字段,一个具有cookie名称,另一个具有一些唯一值(可以是随机的,可以是时间戳或计数器;实际上并不重要)
  2. 提交表格。
  3. 在服务器上,代码应该执行通常用于创建下载的任何操作。它应该创建一个具有给定名称和值的新cookie。返回回复。
  4. 回到客户端,在提交表单后立即启动间隔计时器(每100毫秒左右)检查是否有一个具有所选名称和选择的唯一值的cookie。一看到cookie,就知道表单响应已经到了!
  5. 至于下载两个文件,我不认为HTTP中有两个附件的规定。您当然可以返回类似zip文件的内容。