Javascript 在AJAX中处理PHP头

Javascript 在AJAX中处理PHP头,javascript,php,ajax,validation,Javascript,Php,Ajax,Validation,我正在使用AJAX进行表单验证。如果用户正确完成表单,它将重定向到另一个页面,否则打印错误(纯HTML)例如: 如果表单中存在错误,则PHP文件将响应: There is an error! 如果没有任何错误,PHP文件将执行: header("Location: http://example.com/successful"); exit(); 但在AJAX中,我只处理简单的HTML响应: success: function(response) { _desireHTMLelment.inn

我正在使用AJAX进行表单验证。如果用户正确完成表单,它将重定向到另一个页面,否则打印错误(纯HTML)
例如: 如果表单中存在错误,则PHP文件将响应:

There is an error!
如果没有任何错误,PHP文件将执行:

header("Location: http://example.com/successful"); exit();
但在AJAX中,我只处理简单的HTML响应:

success: function(response) {
_desireHTMLelment.innerHTML = response;
}
我知道有一种方法可以使用
json\u encode()
,但是,我仍然无法将普通HTML和
json
进行分类
我有什么办法可以做到这一点吗?谢谢你的支持
编辑:我正在使用香草JavaScript
这就是系统的工作原理:

用户填写表单=>AJAX发送请求=>PHP处理请求=>返回纯HTML错误或重定向页面=>AJAX接收响应,分类是错误还是HTML错误=>找到正确的方法来处理响应

,如昆廷所述,浏览器会自动跟随
位置
标题并重定向页面,在这种情况下,您的Ajax响应将包含新页面的内容,您将无法访问
位置
标题,因为它已丢失并被新页面的内容替换。您可以为标题使用不同的名称

从代码中可以看出,您使用的是jQuery,而不是JavaScript。您可以如下方式访问jQuery中的标题:

success: function(response, status, request){
    var url = request.getResponseHeader('RedirectURL'); //RedirectURL: your header's name.
}
在JavaScript中,使用
XMLHttpRequest
对象的函数来获取标题:

var headers = request.getAllResponseHeaders();
但与jQuery不同,您必须自己分割和处理头

从标题中获取url后,可以使用:

location.replace(url);
这将模拟重定向。如果要模拟链接单击,请使用:

location.href = url;
或者,您可以在响应中发送URL,而不是发送标题。如果它总是以http开头,则可以执行以下操作:

success: function(response) {
    if (response.substring(0, 4) == "http") {
        location.href = response;
    } else {
       _desireHTMLelment.innerHTML = response;
    }
}
或者,您可以这样标记它并查找标记:

RedirectURL: http://example.com/successful
或者可以将其设置为JSON对象:

{"RedirectURL": "http://example.com/successful"}

如果浏览器在HTTP响应中接收到
位置
标题,则它将遵循重定向并获取要重定向到的文档

无法使用JS读取重定向响应


您的请求有两种可能的结果:

  • 响应包含文本
    有错误
  • 响应重定向浏览器,浏览器将获得不包含该文本的新响应
  • 因此,要判断您有两种情况中的哪一种:在响应文本中搜索
    有错误

    success: function(response) {
        if (response.indexOf("There is an error!" == -1) {
            // Handle the error
        } else {
           _desireHTMLelment.innerHTML = response;
        }
    }
    


    也就是说,更好的方法是更改服务器端代码,使其提供清晰的API,而不是试图从HTML中获取数据。

    根据响应在javascript中执行重定向。因此,您需要从php发送响应,而不是使用
    header()
    重定向。@jeroen我知道,我为此使用了
    json\u encode
    ,但是,我不知道如何使用纯HTMLOr对其进行分类。如果ajax没有给出响应,请提交表单errors@mplungjan,如何检查PHP是否没有发送任何错误?这就是问题所在thing@WebDegBrian你不应该。发送回纯文本或发送回json;根据不同的情况,没有不同的反应。您也可以用json发送html。谢谢,但我使用
    request.getAllResponseHeaders().trim().split(/[\r\n]+/)
    要获取标题数组是的,这是您应该使用的,那么有什么问题吗?我正在我的网站上进行测试。如果是正确的,我将投票支持你的答案你不能像那样访问
    位置
    标题。是的,昆汀是对的。我没有注意到您的头的名称是标准重定向头。查看我的更新答案。这就是系统的工作方式:用户填写表单,AJAX将其发送到指定的PHP文件,PHP处理它,返回普通HTML或重定向页面。但是如果我使用AJAX,它只会重定向我文档的一部分。你真的应该修复服务器端脚本,停止返回基本html或重定向,让它始终返回一个json对象,并说明如何处理AJAX的结果。如果您想在有人关闭JS的情况下重复使用脚本(傻瓜),那么请始终在ajax请求中传递一个变量,这样您就可以讨论如何返回数据(json或基本html/重定向)。@IncredibleHat,谢谢,我将尝试按照您的说明进行操作。您误解了这个问题。在您提到的两种可能结果中的第一种结果中,响应可能包含多条错误消息中的一条,因此除非您标记它(例如,
    ERR:有错误!
    ),或者将其设置为JSON对象,否则无法检测到它。至于第二种可能的结果,您的解决方案太浪费资源了。为什么让Ajax重定向到页面,然后检测到并再次重定向?(您将结果分配给了一个元素,但OP想要重定向,因此您需要用结果替换整个页面)。