Jquery AJAX调用创建下载文件似乎运行两次 - 努力理解原因:o(

时间:2011-02-01 21:55:12

标签: php javascript ajax jquery

我正在使用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调用。

如果这里有一个非常愚蠢的错误,那么道歉,但我现在花了很多时间四处寻找并且无法解决这个问题。

我真的很感激任何帮助。提前谢谢。

2 个答案:

答案 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