如何使用 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() + '&register=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() + '&register=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() + '&register=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 令牌

js怎样获取调用回调函数的参数值

如何在函数内部触发 $.post?

POST 到服务器,接收 PDF,使用 jQuery 交付给用户

如何使jquery“$ .post”请求同步[重复]

在 jquery 的 post 中传递参数