如何使用 jQuery 的 $.post 函数获取“位置”标题?
Posted
技术标签:
【中文标题】如何使用 jQuery 的 $.post 函数获取“位置”标题?【英文标题】:How to get the "location" header with jQuery's $.post function? 【发布时间】:2012-02-23 16:13:31 【问题描述】:我正在尝试创建一个可以处理表单的弹出框(使用 jQuery),并且在大多数情况下,我都可以正常工作。我唯一遇到的问题是,在成功登录和/或注册时,php 会发送一个标头位置以将用户重定向到他们的“家”,并在我加载表单的 div 中创建一个无限循环的重定向.
如果在 post 请求中发送了 location
标头,我将如何阅读,然后获取作为新 location
发送的实际 URL?
这是我迄今为止尝试过的(除其他外):
$('.register').live('submit', function(e)
e.preventDefault();
var form_data = $(this).serialize() + '®ister=register&js=true';
$.post(site_path + '/register', form_data, function(data, text, xhr)
alert(xhr.getResponseHeader("Location"));
// $('.overlay_container').html(data);
);
);
不确定我到底做错了什么,但据我所知,这些方面的东西应该可以工作。我还尝试使用普通的 AJAX 发布请求来执行此操作,但没有预期结果。
请注意,不会总是发送位置标头;只有当有人成功登录、注册等时。
理想情况下,这就是我想要实现的目标:
$('.register').live('submit', function(e)
e.preventDefault();
var form_data = $(this).serialize() + '®ister=register&js=true';
$.post(site_path + '/register', form_data, function(data, text, xhr)
var header_location = xhr.getResponseHeader("Location");
if(header_location == null)
$('.overlay_container').html(data);
else
window.location = header_location;
);
);
【问题讨论】:
您应该始终避免使用jQuery.live()
!使用.on()
。如果.on()
在您的jQuery 版本中不可用,请使用.delegate()
。
@Tadeck 最初我曾尝试使用.on()
,但它似乎不起作用。我正在使用 Google CDN 的 1.7.1。据我所知,它应该包含在其中(从 1.7 开始),但它无法工作。 ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js
.on()
自 1.7 起包含,它确实有效。此外,.on()
可以完全替代.live()
和.delegate()
,优于它们并且意在替代它们。看来您使用不正确或犯了其他错误。
如果我错了,请纠正我,但我不会用.on()
替换.live()
吗?我正在尝试在通过.load()
加载的 HTML 上使用此功能。奇怪的是,当我执行上述操作时它不起作用,而 .live()
确实起作用。
是的,您绝对应该将.live()
替换为.on()
,但要正确操作(如上所述)。当涉及到您的问题时,是否执行了成功回调?换句话说:您的脚本是否到达了var header_location = ...
部分?我相信不是,但请确认或否认。
【参考方案1】:
据我所知,您实际上无法读取 Location
标头,因为 javascript 会跟随它,直到它们停止,然后将 headers
发回,这意味着我得到了目标页面的标头,而不是最初发布到的页面。
因此,如果页面是使用 JavaScript(或 jQuery)请求的,我已经编辑了我在 PHP 脚本中的重定向函数以发送自定义标头。
public function redirect($redirect = NULL)
global $_CONFIG;
if($_POST['js'] == 'true')
exit(header('Redirect: ' . $_CONFIG['site']['path'] . '/' . $redirect));
else
exit(header('Location: ' . $_CONFIG['site']['path'] . '/' . $redirect));
这样我可以读取重定向是否实际发送,并在 JavaScript (jQuery) 端正确处理它。
这是最终结果的样子:
$('.popup').on('submit', '.register', function(e)
e.preventDefault();
var action = $(this).attr('action'), form_data = $(this).serialize() + '®ister=register&js=true';
$.post(action, form_data, function(data, text, xhr)
var header_location = xhr.getResponseHeader('Redirect');
if(header_location == null)
$('.overlay_container').html(data);
else
window.location = header_location;
);
);
【讨论】:
根据我的经验,浏览器不会自动跟随任何带有 Location 标头的内容。我刚刚做了一个测试,收到了一级响应。以上是关于如何使用 jQuery 的 $.post 函数获取“位置”标题?的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 jQuery 执行 POST 请求以获取 Strava OAuth 令牌