3

我有以下 javascript 代码:

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

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

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

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

4

5 回答 5

1

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

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

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

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

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

例子:

$('#myForm').submit({
    $.post("<receiver>", postdata, function() {
        ...
    });
    return false; // <!-- That's the important bit
});
于 2013-02-22T09:47:23.140 回答
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");
    });
})
于 2013-02-22T09:53:20.220 回答
0

您的警报导致您的脚本暂停,因此您有时间$.post()完成。

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

于 2013-02-22T09:47:58.113 回答
0

因为它会导致延迟。当您按 OK 时,请求(至少需要几毫秒)完成,并且取决于它的东西可以跟随。

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

$.post( url, postdata, function() {
    // Success.
} )
于 2013-02-22T09:49:46.653 回答
0

.post 是异步的。

如果您在发布过程 () 期间更改页面,则 POST 请求将被中止。您alert正在阻止此页面更改

您应该用 .ajax 同步请求替换您的 .post,验证表单提交是否成功 ( return true;) 。或者按照@DarinDimitrov 或@Curt 的建议进行操作

于 2013-02-22T09:53:12.907 回答