原本現在文件直接通過超鏈接可以完成下載,但現在要在url中附帶幾個參數,並且這些參數要是點擊事件觸發時的最新值,所以這里使用ajax的方式進行下載
然而:
1.使用ajax,ajax的返回值類型是json,text,html,xml類型,或者可以說ajax的發送,接受都只能是string字符串,不能流類型,所以無法實現文件下載,強用會出現response沖突。
如果非要使用ajax的話,只能通過返回值得到生成的文件相關url。然后在回調函數里通過創建一個iframe,並設置其src值為文件url,或者一個對文件生成流的處理url,這樣操作來實現文件下載且頁面無刷新。
2.不使用ajax,通過dom動態操作或創建iframe,form的方式來實現,在下載文件的同時實現頁面不刷新,其中iframe的src可以是文件地址url來直接下載文件,也可以是流處理url通過response流輸出下載,form的是流處理url通過response流輸出下載,dom動態操作的時候實現文件下載,且頁面無刷新。
這里就是用兩兩種操作dom方式實現下載:
操作iframe方式:
function ajaxDownload(urlPost,data){ $.ajax({ url: urlPost, type: "POST", cache: false, data:data, beforeSend:function(){ $("#grid_crud").pqGrid("showLoading") }, success: function(filename) { var url = urlPost + (((urlPost.indexOf("?") > 0) ? "&" : "?") + $.param(data)); $(document.body).append("<iframe height='0' width='0' frameborder='0' src=" + url + "></iframe>") }, complete:function(data){ $("#grid_crud").pqGrid("hideLoading") }, error:function(a,b,c){ $("#grid_crud").pqGrid("hideLoading") } }); }
操作form形式:
function ajaxDownload(url,data,method){ if(url && data){ // data 是 string 或者 array/object data = typeof data =='string'?data:jQuery.param(data); var inputs =''; jQuery.each(data.split('&'),function(){ var pair = this.split('='); inputs +='<input type="hidden" name="'+pair[0]+'" value="'+pair[1]+'"/>'; }); jQuery('<form action="'+url+'" method="'+(method || 'post')+'">'+inputs+'</form>').appendTo('body').submit().remove(); } }