【问题标题】:JSON breaking back button in Chrome, Reload Button in IE (Showing as naked data)Chrome 中的 JSON 后退按钮,IE 中的重新加载按钮(显示为裸数据)
【发布时间】:2012-05-29 18:14:13
【问题描述】:

在任何事情之前:$.getJSON back button showing JSON return data not the page 没有帮助,https://groups.google.com/group/angular/browse_thread/thread/3787ad609c0beb77/eb1b57069dab9f63 没有帮助,互联网也没有帮助。

问题来了:

我从页面中调用一个 url 来获取 json 数据,然后在同一页面内使用 jquery 模板进行渲染。

假设我们在页面 http://someurl.com/search 上,我们正在发起这样的请求

$.ajax({
  url: '/searchthis', //important, this is NOT THE SAME URL
  cache: false,
  type: 'GET',
  headers: {
    "Accept": "application/json",
  },
  dataType: 'json'
  success: function(data) {
    doSomethingWithResults(data);
  }
});

Rack 响应的缓存控制标头设置为无缓存:

Cache-Control:no-cache

一切正常,但是如果您在 Chrome 中离开该页面到另一个页面,然后按返回按钮,您将看到裸 JSON 数据。当您在 IE8 中点击重新加载按钮时,也会出现相同的行为。如果您只需在地址栏中的 url 上按 Enter 键,两者都可以正常工作。

我不知道如何解决这个问题,因为 Chrome 的人不会这样做(请参阅 http://code.google.com/p/chromium/issues/detail?id=108425

在我看来,这似乎是浏览器方面的误解,因为它缓存了一些它确实不应该缓存的东西(响应标头),并且它缓存了错误的 url 下的东西(因为 JSON 请求没有命中相同的 URL)

【问题讨论】:

    标签: jquery ruby-on-rails ruby internet-explorer google-chrome


    【解决方案1】:

    问题实际上是 Rails:Chrome 和 IE 都请求没有特定格式的最后一个响应,所以 Rails 只取第一个响应块,在我的例子中恰好是 json。将 html 块放在 json 块前面解决了这个问题。

    respond_to do |format|
      format.html { ... } //important because the request comes with no specific format
      format.json { ... }
    end
    

    【讨论】:

      【解决方案2】:

      我在使用 Chrome 时遇到了同样的问题。我的控制器的方法确实有format.html

      respond_to do |format|
        format.html
        format.js
      end
      

      Chrome 似乎缓存了结果,所以我可以通过在我的 ajax 请求中添加数据条目来解决这个问题,如下所示:

      $.ajax({
         url: '/restful/path',
         data: { format: 'js' }, // This line here
         dataType: 'json'
      });
      

      或者您可以通过将格式附加到请求的末尾来传递格式,只需确保您的路由中有 (.:format) 选项

      $.ajax({
         url: '/restful/path.js',
         dataType: 'json'
      });
      

      希望这对某人有所帮助

      【讨论】:

      • 我在一个快递应用程序中遇到了类似的问题。似乎传递了一个空对象,因为数据值可以解决问题。感谢您发布此内容。
      • 确实,通过在数据中发送格式来修复它。我使用json,就像这样:$.getJSON(path, { format: "json" }, handler_func(response){ // do something }) 让它工作
      猜你喜欢
      • 2014-09-24
      • 1970-01-01
      • 2015-05-20
      • 2015-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      • 2016-03-18
      相关资源
      最近更新 更多