【问题标题】:Turbolinks, Rails, back button, footer from other sourceTurbolinks、Rails、后退按钮、来自其他来源的页脚
【发布时间】:2017-11-06 13:59:20
【问题描述】:

我对 turbolink 有疑问。当我在浏览器中单击“后退”按钮时,会附加一个页脚。

application.html.slim:

doctype html
html
  head
    title
      - unless content_for(:title).present?
        | Some text...
      - else
        == yield :title
    meta name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no'
    = csrf_meta_tags
    = stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload'
    = javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
    - if admin_admin_signed_in?
      = stylesheet_link_tag    'cms/application', media: 'all', 'data-turbolinks-track': 'reload'
      = javascript_include_tag 'cms/application', 'data-turbolinks-track': 'reload'

我从其他来源 (application.coffee) 加载页脚:

$(document).on 'turbolinks:load', ->
    $('footer').get(0).innerHTML = ''
    for src in ['//other_site.com/goc/us/other_site.com/responsive.js', '//other_site.com/footer-builder.js']
      s = document.createElement('script')
      s.async = true
      s.src = src
      document.getElementsByTagName('head')[0].appendChild s

提前感谢您的关注!

【问题讨论】:

  • 这是因为 turbolink 缓存了你的内容
  • @uzaif 感谢您的回答!我该如何解决这个问题?
  • @uzaif 我添加了有关该问题的更多信息
  • 您可以使用Turbolikns.clearCache()方法清除缓存,也可以清除rails端的缓存
  • @uzaif 非常感谢!

标签: javascript ruby-on-rails caching coffeescript turbolinks


【解决方案1】:

正如@uzaif 所说,您应该将Turbolikns.clearCache() 放入您的.js file 以用于特定的dom 元素,甚至在类似情况下的页面。就我而言,我以这种方式添加了以下代码和平:

application.coffee:

$(document).on 'turbolinks:load', ->
  $('footer').get(0).innerHTML = ''
  for src in ['//other_site.com/goc/us/other_site.com/responsive.js', '//other_site.com/footer-builder.js']
    s = document.createElement('script')
    s.async = true
    s.src = src
    document.getElementsByTagName('head')[0].appendChild s
  Turbolikns.clearCache()

请记住,它会降低页面加载速度,因此请确保对应用程序进行分析

【讨论】:

  • 你打错了,Turbolikns.clearCache() 应该是 Turbolinks.clearCache()
【解决方案2】:

通过清除缓存(如 https://stackoverflow.com/a/44398711/783009),您将错过 Turbolinks 提供的一些性能优势。

@uzaif 是正确的,因为页面正在被缓存。这是正在发生的事情:

  1. 第 1 页加载
  2. 页脚是从其他来源加载的
  3. 用户点击第 2 页的链接
  4. Turbolinks 缓存页面
  5. 第 2 页加载
  6. 用户按返回键
  7. Turbolinks 加载缓存页面(带有页脚)
  8. 页脚再次从其他来源加载:/

如果您在每次页面加载时都向页面添加 HTML,惯用的方法是“拆除”任何脚本对 turbolinks:before-cache 的影响。在没有看到页脚脚本做什么的情况下为此编写代码有点棘手,但总体思路是:

$(document).on 'turbolinks:load', ->
  # load your footer…

$(document).on 'turbolinks:before-cache', ->
  # teardown your footer

有关这方面的更多信息,请参阅此处:https://github.com/turbolinks/turbolinks#preparing-the-page-to-be-cached

或者,如果页脚在页面加载之间没有改变,您可能希望只加载一次内容(例如在$(document).ready),然后在页面加载之间保持它。为此,您需要为页脚提供一个 ID 和一个 data-turbolinks-permanent 属性。只要带有 ID 的页脚在来自服务器的每个响应中,页脚内容就会被维护。有关这方面的更多信息,请参见此处:https://github.com/turbolinks/turbolinks#persisting-elements-across-page-loads

【讨论】:

  • 绝对正确!我试过turbolinks:before-cache,但没有成功,无论如何,非常感谢你的好点和完整的答案!
  • 不客气!如果您可以展示页脚加载前后 HTML 的不同之处,我可能会提供进一步的帮助 :)
  • 太棒了!多谢一次! :)
猜你喜欢
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 2013-09-04
  • 1970-01-01
相关资源
最近更新 更多