【问题标题】:How to get the "location" header with jQuery's $.post function?如何使用 jQuery 的 $.post 函数获取“位置”标题?
【发布时间】: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 = ... 部分?我相信不是,但请确认或否认。

标签: jquery post 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 标头的内容。我刚刚做了一个测试,收到了一级响应。
猜你喜欢
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多