我有以下javascript代码:
$.post("<receiver>", postdata);
并不总是得到postdata。如果我写下面的代码一切正常:
$.post("<receiver>", postdata);
alert('bla-bla-bla, read me for a second');
为什么呢?当javascript运行时,页面正在更改保存按钮。但我需要在重定向之前发送帖子数据。
答案 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