我正在尝试AJAXify一个旧的网站表单而不修改后端。最初,后端会在收到表单后回复“302 Moved”重定向到“谢谢”页面。
现在,当我尝试使用jQuery $ .ajax调用提交表单时,表单数据已成功提交,但“302 Moved”重定向似乎被浏览器取消,jQuery不知道发生了什么
我的问题是,无论发生什么,$ .ajax调用都会返回错误并且status = 0,所以我无法区分成功提交和错误。
有没有办法阻止浏览器尝试关注重定向,或者至少找回正确的响应代码? (我正在使用Chrome。)
答案 0 :(得分:1)
我认为不,你不能在不改变后端的情况下这样做。你必须改变响应头,让Ajax知道/理解该怎么做。如果你做了重定向,你必须改变标头,因为Ajax调用响应不会这样做。
答案 1 :(得分:0)
这可以让你朝着正确的方向前进吗?
$.ajax({
type: "GET",
url: url,
data: data,
complete: function(e, xhr, settings){
if(e.status === 200){
console.log(e.responseText);
}else{
console.log("error");
}
}
});
答案 2 :(得分:0)
您的后端应用程序可能具有相对重定向,可能以某种方式不被jquery ajax处理。在这种情况下,位置标头不会包含域名,只是相对路径。对于一些人(我不清楚;))原因,它可能会导致相同的原产地政策问题。什么是有趣的,改变重定向到绝对路径应该解决问题。在jQuery 1.11.1上测试过。
理论上的ajax电话:
$.ajax({
'url': '/your-url',
'method': 'post',
'data': form.serialize()
}).done(function(data) {
// something
}).fail(function(jqXHR, textStatus, errorThrown) {
// another something
});
所以在/ your-url控制器中你可能有类似的东西:
return $this->response->redirect('//same.domain/path');
或
return $this->response->redirect('/path');
第一个将工作。第二个不是。
关键是你可能需要改变后端,但只需要一点点。如果你真的不想和/或以不同的方式处理它,你不需要检查XmlHttpRequest的请求。
答案 3 :(得分:0)
Ajax代码如下所示:
$.ajax({
'url': '/your-url',
'method': 'post',
'data': form.serialize()
}).done(function(data) {
// something
}).fail(function(jqXHR, textStatus, errorThrown) {
if (jqXHR.getResponseHeader('Location') != null)
{
window.Location= jqXHR.getResponseHeader('Location');
}
// other conditions in failure situation.
});
答案 4 :(得分:0)
检查表单是否为{{csrf_field()}}。这是在没有令牌的情况下提交表单时引起的。