我試圖在瀏覽器通過POST請求下載文件時顯示文件鏈接旁邊的下載gif。目前,點擊文件鏈接什麼也不做。如果我將.submit(function(){...});
更改爲.submit();
,那麼它會下載該文件,但不會顯示加載gif。如果我在.submit();
之前將加載gif設置爲.show();
,那麼在文件已經下載之後它纔會顯示。submit()函數干擾提交事件
這裏是我目前的結構和JS ......
HTML
<a class="file" data-location="directory/file">File.xlsx</a>
<span class="download_loader"></span>
JS
$(document).on('click', 'a.file', function() {
var location = $(this).data("location");
var name = $(this).html();
var loader = $(this).nextAll("span.download_loader");
$('<form action="FileManager/download.php" method="POST" id="temp_download_form"><input type="hidden" name="name" value="'+name+'" /><input type="hidden" name="location" value="'+location+'" /></form>').appendTo('body').submit(function(loader) {
loader.show();
return true;
});
$("#temp_download_form").remove();
});
- 解決方案 -
我終於能夠根據下面的答案和評論得到正在工作的東西。我使用https://github.com/filamentgroup/jQuery-File-Download的下載功能以及一些超時功能來管理流量。最後的用戶體驗很好,並允許下載gif顯示和隱藏很好。在這裏看到:http://d.pr/i/KfRP
最後JS代碼
// Download Function
function download(url, data, method){
//url and data options required
if(url && data){
//data can be string of parameters or array/object
data = typeof data == 'string' ? data : $.param(data);
//split params into form inputs
var inputs = '';
$.each(data.split('&'), function(){
var pair = this.split('=');
inputs+='<input type="hidden" name="'+ pair[0] +'" value="'+ pair[1] +'" />';
});
//send request
$('<form action="'+ url +'" method="'+ (method||'post') +'">'+inputs+'</form>')
.appendTo('body').submit().remove();
};
};
// Download File
$(document).on('click', 'a.file', function() {
var location = $(this).data("location");
var name = $(this).html();
var cell = $(this).closest('td');
$('<span class="download_loader"></span>').appendTo(cell);
setTimeout(function(){
download('FileManager/download.php','name='+name+'&location='+location,'post');
}, 1000);
setTimeout(function(){
$("span.download_loader").fadeOut();
}, 2000);
});
爲什麼ü沒有把HREF標記中的文件?和usd防止默認方法。 –
文件可能沒有足夠的時間在瀏覽器鎖定之前加載,因爲您發佈表單,頁面將刷新... – epascarello
@ C-link這不是必需的,只是代碼膨脹。 –