17

我正在尝试在不修改后端的情况下对旧网站表单进行 AJAX 化。最初,后端在收到表单后会响应“302 Moved”重定向到“thank you”页面。

现在,当我尝试使用 jQuery $.ajax 调用提交表单时,表单数据已成功提交,但“302 Moved”重定向似乎被浏览器取消,并且 jQuery 不知道发生了什么。

我的问题是,无论发生什么,$.ajax 调用都会返回错误并且 status = 0,所以我无法区分成功提交和错误。

有没有办法阻止浏览器尝试跟随重定向,或者至少取回正确的响应代码?(我正在使用 Chrome。)

4

5 回答 5

1

我认为不,如果不更改后端,您将无法做到这一点。您必须更改响应标头,以便 Ajax 知道/理解要做什么。如果您进行了重定向,则必须更改标头,因为 Ajax呼叫响应不会这样做。

于 2015-06-11T21:27:34.923 回答
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");
       }
   }
   });
于 2015-04-30T20:12:29.813 回答
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。

于 2015-06-11T22:13:34.543 回答
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.
});
于 2016-02-13T17:45:59.647 回答
0

检查表单并添加 {{csrf_field()}}。这是在没有令牌的情况下提交表单时引起的。

于 2017-03-03T07:50:10.597 回答