2012-10-10 14 views
0

我有一個按鈕[下載文件]它做這兩件事情:防止形式從後取消阿賈克斯行動提交下載

  1. 一個Ajax調用並填充數據表。
  2. Post提交一份表格:

    a。運行創建文檔的後端腳本

    b。以瀏覽器下載文檔的方式將文檔返回給瀏覽器。

一個問題。 post提交不是ajax,這意味着瀏覽器以與點擊鏈接,刷新頁面或關閉窗口相同的方式對待它,例如。它取消了ajax請求,甚至沒有得到響應錯誤

在按鈕上使用.preventDefault()不起作用。它確實允許ajax調用()成功完成,但不提交表單,所以()表單從不提交。

<form action="/backendScript" method="post"> 
     <input type="submit" value="Download Document"> 
    </form> 

    $(".downloadBtn").on("click", function (e) { 
     generateTable(); 
     e.preventDefault(); // without this, the ajax in generateTable(); is cancelled, but with it, the form isn't submitted. 
    }); 

做()與阿賈克斯post也不起作用。它可以完成(2.a),但返回的文檔直接轉到Javascript,而不是瀏覽器,並且Javascript無法導致下載事件,因此(2.b)以此方法失敗。

$.post("/backendScript", formData, function (generatedDoc) { 
     console.log(generatedDoc); //yay, here's our doc! but how do we download it?? 
    }); 

所以看起來我必須post提交表單。但是,我怎樣才能防止這個取消正在進行的任何Ajax請求?

+0

您應該添加表單屬性target =「_ blank」。這樣,下載可以立即開始,並且阿賈克斯調用不會被取消。 – user1333371

回答

2

generateTable中您希望從ajax調用中獲得的成功/錯誤/任何響應事件中,提交表單。 document.forms["myform"].submit();$('#myform').submit();(取決於您是否想使用vanilla js或jQuery)。

+0

不錯。其中一個缺點是被填充的表可能很大,用戶將不得不等待下載開始,但我認爲這是一個可以接受的折衷。爲什麼'preventDefault()'需要在ajax之前移動? – brentonstrine

+0

我只是喜歡那是第一件事。基本上,我的代碼是這樣說的:「嘿,我會從這裏拿走它。」感覺好一點吧。 – Gromer

+0

你說得對,沒關係。我刪除了它,因爲它不相關。 – Gromer