2014-04-10 68 views
0

我需要從服務器下載一個文件並在客戶端上彈出「另存爲」框。我不能在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),這是行不通的)。

任何想法?或另一種方式來下載兩個文件與兩個另存爲對話框?

+0

如果你不使用AJAX,表單提交是同步的,並導致頁面重新加載。 – Barmar

+0

它將始終是同步的。由於javascript(包括表單提交)是除Ajax調用之外的同步和單線程模型。
欲瞭解更多幫助,請參閱http://stackoverflow.com/questions/17188149/how-to-make-form-submission-synchronous –

+0

@ShreyosAdikari它在這個意義上並不是真正的同步。 「提交」功能立即返回,然後在某個時間點,響應將到達。由於回覆是附件,頁面不會被覆蓋。 – Pointy

回答

1

一個很棒的技巧是使用cookie。訣竅是這樣的:

  1. 創建臨時表,並添加填充兩個附加字段,一個用一個cookie的名字和其他一些獨特的價值(可能是隨機的,可能是一個時間戳或計數器;並不重要)。
  2. 提交表單。
  3. 在服務器上,代碼應該執行正常操作來創建下載。它應該用給定的名稱和值創建一個新的cookie。返回響應。
  4. 回到客戶端,在提交表單之後,啓動一個間隔計時器來檢查(每100ms左右)是否有一個具有所選名稱和所選唯一值的cookie。只要你看到cookie,你就知道表單響應已經到了!

至於下載兩個文件,我不認爲有兩個附件的HTTP中有任何規定。你當然可以返回類似zip文件的東西。