【问题标题】:jQuery.post() and redirect via ajaxjQuery.post() 并通过 ajax 重定向
【发布时间】:2012-01-25 11:06:56
【问题描述】:

我正在使用jQuery.post()向服务器发送数据,当服务器将数据发送回客户端时,将调用 post() 回调。我知道服务器可能会使用重定向标头字段(“Location”)进行响应。

目前,重定向不会发生。可能是什么原因? 是否有可能在重定向发生之前运行脚本?

更新: 附上一段截断的代码。我知道服务器接受 POST 方法,并且服务器响应 POST。不知何故,总是在调用error()(似乎它甚至在客户端\浏览器接受响应之前就发生了)。

怎么了?

$(document).ready(function() {  
    $("#loginForm").submit(function() {
        $.ajax({
            type : "POST",
            data : $("#loginForm :input").not("#loginBtn").serialize(),
            url : "http://localhost/auth",
            success : function(data, textStatus, jqXHR) {
                alert("success");
                alert(jqXHR.getResponseHeader("Location"));
            }, 
            error : function(jqXHR, textStatus, errorThrown) {
                alert("error");
            }
        });
    });
});

【问题讨论】:

  • 你也可以在你的问题中添加错误细节吗?

标签: javascript ajax dom jquery


【解决方案1】:

jquery.post() 通过发出 Ajax 请求来工作。在 Ajax 调用中,PHP 脚本异步工作(将其视为后台线程)。因此,PHP 脚本无法重定向客户端的浏览器。可行的方法是让 PHP 脚本响应要重定向到的 URL,并使用 javascript 进行重定向。

在您的 POST 回调中:

function(data){  //data will be the URL to redirect to, sent back by the PHP script
window.location = data;
}

编辑

来自jquery.ajax() 上的 Jquery 文档

statusCode(添加1.5)地图

Default: {}

响应具有相应代码时要调用的数字 HTTP 代码和函数的映射。例如,当响应状态为 404 时,以下内容会发出警报:

$.ajax({
  statusCode: {
    404: function() {
      alert('page not found');
    }
  }
});

如果请求成功,状态码函数采用与成功回调相同的参数;如果导致错误,它们采用与错误回调相同的参数。

【讨论】:

  • 我正在寻找通用解决方案,它不依赖于服务器实现。即,使用 HTTP 标头等。
  • 您可以在收到响应时尝试检查 302 标头状态。我不确定您如何获得该位置,但没有 PHP 脚本明确将其发送给您
  • 请忘记 PHP。是否有可能访问 jQuery/javascript/DOM 中的 HTTP 响应标头?
  • @MrIzik:请参阅有关如何在 jquery 中处理 HTTP 响应状态的编辑。 jquery.post()jquery.ajax() 的简写。您必须处理302 的状态码
  • 服务器端脚本重定向时,会将他的Header状态设置为302(临时重定向)。仅当标头状态为 200(成功)时才调用成功函数。如果你没有像上面我的代码 sn-p 那样映射特定的状态码,那么除了 200 之外的所有头部状态都会导致错误函数被调用
【解决方案2】:

请在重定向的情况下获得简单的响应而不重定向打印任何标志,如“重定向”,并使用

编写客户端重定向
if(responce == 'redirect')
    window.location = "Your url"

不要在服务器上重定向。

它会起作用的。

【讨论】:

    【解决方案3】:

    如果您执行导致重定向的操作,JQuery 不会检测到它。浏览器会在后台自动处理它,以创造无缝体验。

    【讨论】:

    • 感谢您的快速回复。浏览器不执行重定向。我认为这是因为jQeury.post() 回调函数正在处理服务器响应。
    • 例如,如果您发布但会话超时,服务器可能会将您重定向到登录页面。您的 jquery 调用完全不知道这已经发生,因为浏览器会为您处理它。在这种情况下,您无法控制响应。如果您确实可以控制自己的情况,那么您应该包含一些让 JQuery 知道的内容。抱歉,我不太了解您的问题,所以如果我的回复没有用,我深表歉意=)
    猜你喜欢
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 2018-08-15
    • 1970-01-01
    相关资源
    最近更新 更多