0
$("#classesLink").click(function(event) {
    $("#globalUserContent").children().slideUp("normal", function() {
        $.ajax({
            type: "POST",
            url: "classes.php?token="+randString+"",
            success: function (msg) {
                $("#globalUserContent").html(msg);
            },
            error: function (msg) {
                $("#globalUserContent").html(msg);
            }
        });            
    });
    return false;
});

我有上面的代码,当我点击.classesLink按钮并检查萤火虫请求时,它显示它被提交了两次,有什么问题吗?

4

2 回答 2

5

这个...

$("#globalUserContent").children()

...可能匹配 2 个元素,因此处理程序会触发两次。


您可以使用 asetTimeout代替。

$("#globalUserContent").children().slideUp("normal");

setTimeout(function() {
        $.ajax({
            type: "POST",
            url: "classes.php?token="+randString+"",
            success: function (msg) {
                $("#globalUserContent").html(msg);
            },
            error: function (msg) {
                $("#globalUserContent").html(msg);
            }
        });
}, 600);
于 2012-03-12T21:05:26.403 回答
2

正如@am 所指出的,我不是。$("#globalUserContent")有两个孩子,所以回调会为每个孩子触发两次,使用这个:

$("#classesLink").click(function(event) {
    $.when($("#globalUserContent").children().slideUp("normal"))
     .then(function() {
        $.ajax({
            type: "POST",
            url: "classes.php?token="+randString+"",
            success: function (msg) {
                $("#globalUserContent").html(msg);
            },
            error: function (msg) {
                $("#globalUserContent").html(msg);
            }
        });            
    });
    return false;
});

这将在效果完成时执行回调 - ajax 请求,slideUp并且不会硬编码setTimeout代码中的延迟。

如果您在代码中进行硬编码,如果持续时间某天会发生变化,或者有人更改了持续时间效果但没有更改超时延迟600,则代码可能会中断。"normal"slideUp

但是您可以将持续时间延迟放在一个变量中,以便在一个地方更改它 - @am 不是我的建议。

when 文档

描述:提供一种基于一个或多个对象执行回调函数的方法,通常是表示异步事件的延迟对象。

于 2012-03-12T21:09:28.773 回答