点击浏览器的“后退”按钮显示的是JSON而不是HTML(使用Rails和d3.js)

Hitting browser "back" button shows JSON rather than HTML (using Rails & d3.js)

本文关键字:使用 HTML Rails js d3 JSON 浏览器 后退 显示 按钮      更新时间:2023-09-26

我正在使用d3.js JSON回调在Rails中生成一个图表,如下所示:

视图

d3.json(document.URL, function(data){ 
    // generate chart
}

控制器

def index
    respond_to do |format|
        format.html do
            # return the HTML
        end
        format.json do
            # return the JSON
        end
    end
end

一切正常。 但是,当用户离开此图表,然后使用浏览器上的"后退"按钮导航回该图表时,他们会看到 JSON 而不是 HTML。

你能建议我如何解决这个问题吗?

嗯,这是因为当您点击后退按钮时,浏览器正在为给定的 URL 提供上次缓存的内容。在您的情况下,最后一个内容是 AJAX (D3) 请求的 JSON。

除了接受的答案,您还可以尝试其他方式 - 只需将.html附加到页面 URL。您可以通过将此过滤器添加到控制器或ApplicationController来自动化它:

   before_filter do
     if request.format == :html && !params[:format]
       redirect_to format: :html
     end
   end

还有第三种标准方法带有Vary: Accept标头,但由于此Chrome错误和浏览器缓存已损坏中所述的一些问题,它可能会导致一些麻烦

d3.json(window.location.pathname + ".json" + window.location.search.substring(0), function(json){  
    // generate chart
}

受到这个问题的启发。