Eli*_*ria 4 html javascript php ajax jquery
我有一个带有表单的网页.当用户提交表单时,我希望服务器使浏览器重定向到表单操作的不同页面.现在,我通过使用PHP的头函数发送302状态代码来做到这一点.它工作正常.
我试图让服务器上的页面以相同的方式重定向浏览器,无论它是否正常提交(没有Javascript)或通过Ajax.我尝试通过将窗口位置设置为Location头中的任何URL来实现此目的.我正在使用jQuery,并进行如下调用:
$.ajax({
url: this.action,
type: "POST",
data: getFormData(this),
complete: function(request) {
window.location.assign(request.getResponseHeader("Location"));
}
});
Run Code Online (Sandbox Code Playgroud)
但是,这没有用.在考虑之后,我意识到这并不是很令人惊讶.在Ajax请求中,浏览器应该在更改readyState之前透明地处理重定向响应,例如302代码.当完整函数运行时,它正在查找最终目标中的Location标头而未找到它.
作为实验,我尝试使用Location标头发送200状态代码.我尝试了Ajax请求,它工作正常.但是,当我执行非Ajax提交时,它不起作用.浏览器转到表单操作页面并保持在那里,就像它忽略了Location标题一样.
有没有办法在两种情况下都使同一页面重定向,而服务器不必知道或关心请求是否是Ajax请求?
如果这很重要,我在各种浏览器(IE8,IE7,IE6,Firefox 3.5,Chrome)中尝试了表格,每次都有类似的结果.此外,我正在做一个帖子请求,以避免碰到IE的2083字符URL长度限制.
HTTP 302响应由XmlHttpRequest实现(例如jQuery的ajax函数)静默消耗.这是一个功能.
我过去解决这个问题的方法是检测XmlHttpRequests并发出"Content-Location"标题(而不是"Location"标题).最常见的跨库工作方式是检查"X-Requested-With"服务器端代码中的http头(jQuery,Prototype,Mootools等设置此代码):
if (@$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
header('Content-Location: ' . $redirect_url);
} else {
header('Location: ' . $redirect_url);
}
Run Code Online (Sandbox Code Playgroud)
您仍然需要特殊情况下的客户端代码:
$.ajax({
// ...
complete: function(xhr) {
var redirect_url = xhr.getResponseHeader("Content-Location");
if (redirect_url) {
window.location = redirect_url;
}
}
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
832 次 |
| 最近记录: |