我正在使用Jquery Ajax调用向网站用户提供文件下载。这个过程是:
1)用户通过单击选择他们想要的各种文件 2)我将他们的选择存储在mysql数据库中 3)我在页面右侧有一个div面板,列出了他们的文件(如一个篮子)并提供了一个下载按钮 4)如果他们点击按钮,它会运行一个jquery ajax调用php文件来创建一个zip文件,将所有选中的文件加载到zip中,然后关闭zip。最后在json中返回zip文件名。 5)成功:然后触发一个窗口。打开强制下载
这一切基本上都有效,但有一个奇怪的问题,我无法解决,它正在杀了我!
以下是代码:
首先是javascript:
//download files in a zip
$("#zipdownload").click(function(){
$.ajax({
type: "GET",
url: "zipdload.php",
dataType: "json",
cache: false,
success: function(data) {
//opens a small window for IE security thing
window.open(data.archive,'download','left=20,top=20,width=300,height=20,toolbar=0,resizable=0');
// then clears all the divs to simulate the bag emptying
$('#bagCounter').text("Empty!");
$('#zipdownload').text("");
$('#item-list').text("");
}
});
});
然后布局:
//styled containers to create a sliding panel with a clickable tab
<div id="rightpanelouter">
<div id="rightpanelinner">
<?php if ($_SESSION['username']){
echo $_SESSION['username'].'<br>Toolbox';
};
?>
<div id="bagContents">
<div id="item-list">
<br> Show Bag
//PHP to generate list of files
</div>
<br><br>
<div id="zipdownload" style="cursor:pointer;">
//this element has the action attached to fire function.
<?php
if ($numOfBagDocs != 0){
echo 'Download';
}
?>
</div>
</div>
如果有人有兴趣我也可以附上PHP脚本,但我猜这不是问题。
问题:
脚本似乎运行两次(至少)。
我最初使用now()戳附加了zip文件名,因此它们总是不同。但我注意到有时候window.open试图下载一个带有1秒不同的now()标记的文件到保存的文件中。
然后我尝试更改为rand()数字,并显示两个不同的随机数!
所以我删除了附加信息,因此文件名总是相同的(只是附加了用户名)并且已经下载但只是保留了相同的zip文件附加新条目。所有这一切都将使拉链成长和成长。
因此,在创建zip之前,我尝试将'file_exists'和'unlink in删除文件。所有这些似乎都是在创建zip之后和jscript下载开始之前删除文件! : - (
所有这些告诉我脚本被调用至少两次。
我见过很多与此类似的条目,但我似乎无法理解它们是否适用于我的问题。一旦建议在点击功能之前链接'unbind'并且刚刚停止它工作,那就没有好处。
我附加的HTML在body标签之后非常简单,并且此部分中没有其他javascript调用。
如果这里有一个非常愚蠢的错误,那么道歉,但我现在花了很多时间四处寻找并且无法解决这个问题。
我真的很感激任何帮助。提前谢谢。
答案 0 :(得分:2)
所以我已经深究了它,却没有真正理解为什么。我猜缺乏正确的javascript教育! 问题与我使用.load从另一个页面加载页面并在第二页中链接相关的JScript有关。然而,点击的DIV在初始页面内(我记得现在我出于审美原因移动了它)。
所以我将click函数移动到从初始页面本身调用的Jscript,并且它现在只需触发一次!
所以我不明白为什么会有所作为,但确实如此,所以我很高兴我可以继续。
感谢阅读,我希望有一天能帮助别人!
答案 1 :(得分:1)
我有同样的问题。我通过添加
解决了这个问题evt.stopImmediatePropagation();
到函数。当然,你必须将evt添加到函数中:
$(document).on("click", "a.className", function (evt) {
evt.stopImmediatePropagation();
$.fileDownload($(this).prop('href'), {
preparingMessageHtml: "File prepared...",
failMessageHtml: "Error!",
});
return false;
});
似乎发生了,因为有多个嵌套元素可以多次触发此事件。 见jQuery Click fires twice when clicking on label