如何在第一个和更新页面成功时调用第二个jQuery.ajax实例

Pau*_*aul 10 javascript ajax jquery

我有一些jQuery,点击与类的链接触发'changetag'.我正在使用$.ajax()changetag.php来更新数据库.

然后我通过在开/关之间切换类来改变链接的视觉外观.代码如下:

$(function() {
$(".changetag").click(function(){
    var element = $(this);
    var I = element.attr("id");
    var info = 'switch_tag=' + I;

    $.ajax({
        type: "POST",
        url: "_js/changetag.php",
        data: info,
        success: function(){}
    });

    $("#li_"+I).toggleClass("off on");
    element.toggleClass("off on");

    return false;
});
});
Run Code Online (Sandbox Code Playgroud)

完美的工作.但是现在我想添加第二个PHP调用,如果上面的成功,它将提取数据并更新页面的另一个区域.

我想补充的是:

$.ajax({
    url: "_js/loaddata.php",
    success: function(results){
        $('#listresults').empty();
        $('#listresults').append(results);
    }
});
Run Code Online (Sandbox Code Playgroud)

但只是将其添加到成功:function(){}似乎不起作用.为了澄清,这是我正在测试的完整代码:

$(function() {
$.ajaxSetup ({cache: false});
$(".changetag").click(function(){
    var element = $(this);
    var I = element.attr("id");
    var info = 'switch_tag=' + I;

    $.ajax({
        type: "POST",
        url: "_js/changetag.php",
        data: info,
        success: function(){
            $.ajax({
                url: "_js/loaddata.php",
                success: function(results){
                    $('#listresults').empty();
                    $('#listresults').append(results);
                }
            });
        }
    });

    $("#li_"+I).toggleClass("off on");
    element.toggleClass("off on");

    return false;
});
});
Run Code Online (Sandbox Code Playgroud)

PHP脚本都被成功调用,并且切换类可以工作,但由于某种原因,拉出的数据不会写入#listresults.

Mat*_*all 22

Ajax调用(默认情况下)是异步的.这意味着这段代码:

$("#li_"+I).toggleClass("off on");
element.toggleClass("off on");

return false;
Run Code Online (Sandbox Code Playgroud)

可以在它之前的ajax调用完成之前执行.对于不熟悉ajax和异步代码执行的程序员来说,这是一个常见问题.完成ajax调用后你想要执行的任何东西都必须放入回调中,例如你的success处理程序:

$.ajax({
    type: "POST",
    url: "_js/changetag.php",
    data: info,
    success: function(){
        $("#li_"+I).toggleClass("off on");
        element.toggleClass("off on");
    }
});
Run Code Online (Sandbox Code Playgroud)

同样,你也可以在那里放第二个ajax调用:

$.ajax({
    type: "POST",
    url: "_js/changetag.php",
    data: info,
    success: function(){
        $("#li_"+I).toggleClass("off on");
        element.toggleClass("off on");

        $.ajax({
            url: "_js/loaddeals_v2.php",
            success: function(results){
                $('#listresults').empty();
                $('#listresults').append(results);
            }
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

使用jQuery 1.5的Deferred Object,你可以使这个更加流畅.

function firstAjax() {
    return $.ajax({
        type: "POST",
        url: "_js/changetag.php",
        data: info,
        success: function(){
            $("#li_"+I).toggleClass("off on");
            element.toggleClass("off on");
        }
    });
}

// you can simplify this second call and just use $.get()
function secondAjax() {
    return $.get("_js/loaddata.php", function(results){
        $('#listresults').html(results);
    });
}

// do the actual ajax calls
firstAjax().success(secondAjax);
Run Code Online (Sandbox Code Playgroud)

这很好,因为它允许您取消嵌套回调 - 您可以编写异步执行的代码,但是编写为同步执行的代码.