【问题标题】:jquery.post(): how do i honor a redirect from the server?jquery.post():我如何尊重来自服务器的重定向?
【发布时间】:2011-04-13 20:04:14
【问题描述】:

我正在尝试不显眼的 JS,在我的 Ruby On Rails 应用程序中使用 JQuery。

用户填写表单后,客户端JQuery代码调用:

$.post("/premises", ui.form)

我可以看到 POST 命中服务器,并且我可以看到服务器向 http://localhost:3000/users/42 发出重定向通知,并完成了要显示的数据。

但是浏览器页面没有改变。这并不让我感到惊讶——客户端javascript的全部意义在于控制更新的内容——我明白了。但在这种情况下,我想尊重服务器回复的任何内容。

我尝试根据How to manage a redirect request after a jQuery Ajax call 扩展对 post() 的调用:

$.post("/premises", 
       ui.item,  
       function(data, textStatus) {
           if (data.redirect) {
               // data.redirect contains the string URL to redirect to
               window.location.href = data.redirect;
           } else {
               // data.form contains the HTML for the replacement form
               $("#myform").replaceWith(data.form);
           }
       });

...但是(除其他问题外)data.redirect 未定义。我怀疑真正的答案很简单,对吧?期待!

【问题讨论】:

    标签: javascript jquery ruby-on-rails unobtrusive-javascript


    【解决方案1】:

    您所指的帖子使用 JSON 作为返回值,它正在服务器端构造该 json。这意味着如果有重定向,您的数据对象看起来像

    {redirect:'redirecturl.html'}
    

    如果不是重定向,那么数据对象会像

    {form:html-string-for-form}
    

    现在的工作是在服务器端相应地构造 json 对象

    【讨论】:

    • 希望服务器会以有效的 JSON 响应。
    【解决方案2】:

    服务器是说你想用 JavaScript 处理的数据在不同的 URL 上可用,而不是浏览器应该将新文档加载到顶层框架中。将浏览器发送到告诉它使用 JS 请求的数据的 URL 不会尊重重定向。

    如果您想这样做,则服务器应使用 JavaScript 解释为向 location 分配新值的原因的数据(在响应正文中)进行响应。

    【讨论】:

      【解决方案3】:

      data.redirect 可能未定义,因为您没有在服务器端指定它。在您链接到该点的答案中,无论结果如何,服务器始终以 200 响应,然后它发送回的 JSON 正文确定客户端的反应方式。因此,在服务器端,您需要回复 {"redirect" : "/where/to/go"}

      【讨论】:

        猜你喜欢
        • 2012-05-06
        • 2014-10-28
        • 1970-01-01
        • 2021-07-09
        • 2012-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-28
        相关资源
        最近更新 更多