jQuery中的Click事件中的ajaxStop

时间:2011-09-07 16:27:53

标签: javascript jquery

我有以下代码,在单击链接时显示确认div。我第一次运行它时,当ajax请求完成时,deleteConfirmation div会向上滑动。但是当我第二次尝试(没有刷新)时,即使没有触发此点击,确认div也会在每次滑落时向上滑动。

$("#deleteConfirm").click(function() {

    if(debug)
        console.log("deleting "+$("#deleteConfirmationCampaign").html());

    $("#mappingsRemove").html("Deleting Campaign and Mappings...");

    // remove each mapping underneath the campaign
    deleteCampaign(apiUrl, "mappings", account+"/"+campaignToDelete[1], "confirmDelete");   

    $(document).ajaxStop(function() { 

        $("#mappingsRemove").html("Finished");

        // slide up the delete confirmation dialog
        $("#deleteConfirmation").slideUp();

    });

});

我的deleteCampaign函数中有多个请求,我使用的不正确吗?

我认为发生的事情是第一次触发它为ajaxStop设置全局监听器。当然这会一直触发,所以它总是试图滑动确认div。也许我需要在第一次滑动之后停止文件监听器到ajaxStop?

任何建议都会对你有所帮助!

3 个答案:

答案 0 :(得分:2)

你对发生的事情是正确的。但我不确定ajaxStop是听的最佳事件。所有请求都完成后会触发,对吧?

我认为您只想对与您的deleteCampain函数相关的请求做出反应。

当所有重要请求都已返回时,您可以使用延迟来执行函数。

var ajax1 = $.ajax("/deleteCampain.php"),
    ajax2 = $.ajax("/deleteCampain2.php");

$.when(ajax1, ajax2).then(function(){ 
    $("#mappingsRemove").html("Finished");
    $("#deleteConfirmation").slideUp();
});

见:

http://api.jquery.com/category/deferred-object/

http://api.jquery.com/jQuery.when

答案 1 :(得分:1)

您可以设置一个全局布尔值,因此它只运行一次:

  $(document).ajaxStop(function() {
       if (!window.firstStop) {
           $("#mappingsRemove").html("Finished");
           // slide up the delete confirmation dialog
           $("#deleteConfirmation").slideUp();
           window.firstStop = true;
       }
  }); 

答案 2 :(得分:1)

在第一轮请求完成后,我解除了文档和ajaxStop函数的绑定,

如果这会导致任何问题,请告知我们:

// listen for the ajax requests to finish
        $(document).ajaxStop(function() { 

            // set the mappings remove to say finished
            $("#mappingsRemove").html("Finished");

            // slide up the delete confirmation dialog
            $("#deleteConfirmation").slideUp();

            // unbind the listener
            $(document).unbind('ajaxStop');

        });