为什么`$ .post`仅在`alert()`之后出现?

时间:2013-02-22 09:43:56

标签: javascript post

我有以下javascript代码:

$.post("<receiver>", postdata);

并不总是得到postdata。如果我写下面的代码一切正常:

$.post("<receiver>", postdata);
alert('bla-bla-bla, read me for a second');

为什么呢?当javascript运行时,页面正在更改保存按钮。但我需要在重定向之前发送帖子数据。

5 个答案:

答案 0 :(得分:1)

您应该在AJAX调用的成功回调中重定向:

$.post("<receiver>", postdata, function() {
    window.location.href = '...';
});

如果在$.post调用之后立即发出警报,则代码可以工作的原因是,当此警报弹出时,浏览器会暂停执行并且您的AJAX调用有足够的时间来完成。

不要忘记,AJAX中的第一个A代表异步,这意味着您只能使用服务器内部返回的结果成功回调。

此外,如果在表单的某个.submit()事件处理程序内或在提交按钮或锚点的某个.onclick()处理程序内执行此AJAX调用,则应确保已取消默认操作返回false,否则在浏览器重定向远离页面之前,您的AJAX调用将永远无法执行。

示例:

$('#myForm').submit({
    $.post("<receiver>", postdata, function() {
        ...
    });
    return false; // <!-- That's the important bit
});

答案 1 :(得分:1)

啊,所以你问题的遗漏部分似乎是你发送点击某些东西的数据?想必是一个链接?该链接会导致浏览器立即关注它,并且在您的示例中,警报会延迟浏览器,使您的帖子有足够的时间来完成。

您需要确保该链接的默认操作被阻止,并在$ .post()的回调中重定向:

$("a.some_class").click(function(evt)
{
    evt.preventDefault(); // makes sure browser doesn't follow the link

    // gather your post data here ...

    var $this = this;
    $.post("<receiver>", postdata, function()
    {
        window.location.href = $this.attr("href");
    });
})

答案 2 :(得分:0)

您的提醒会导致您的脚本暂停,从而为您的$.post()留出时间。

您应该将重定向脚本放在$.post()回调中。

答案 3 :(得分:0)

因为它会导致延迟。当您按下OK时,请求(至少需要几毫秒)就会完成,并且依赖它的内容可以跟随。

为防止这种情况发生,您可以传递一个在请求得到响应后运行的回调函数。

$.post( url, postdata, function() {
    // Success.
} )

答案 4 :(得分:0)

.post是异步的。

如果您在后期处理()期间更改页面,POST请求将被中止。 您的alert阻止了此页面更改

您应该使用.ajax同步请求替换.post,并在成功时验证表单提交(return true;)。或按照@DarinDimitrov或@Curt

的建议行事