使用 turbolinks 时如何清除 window 变量

How to clear window variables when using turbolinks

在 rails 上使用 ruby,我有使用以下咖啡脚本触发的代码;

$ = jQuery
$(document).on "turbolinks:load", ->
  if window.progress?
    // execute code on a div with an id of ```target```

在要触发代码的页面上,我有一个 ID 为 target 的 div 和一个加载 progress 参数的脚本标记 例如

<%= javascript_tag id: "window_vars" do %>
  window.progress = <%= raw graph.data.to_json %>
<% end -%>

如果没有 turbolinks,那么这工作正常,代码在它想要的页面上触发,而不会在其他页面上触发。但是,如果我启用 turbolinks 5.0.1 并且我访问了代码不触发的页面,然后转到代码触发的页面,然后返回代码不触发的页面,代码触发在最后一页有一个例外。似乎 turbolinks 没有清除页面加载之间的 window.progress 变量。

如何确保通过脚本加载的 window 变量在页面之间被清除?

解决方法是不依赖 window.progress 来检测图形是否存在,而是使用 id,例如

if $('#target').length > 0

我 运行 今天在做类似的事情时遇到了同样的问题。我推测的是全局变量在 turbolinks 访问之间持续存在。这实际上是有道理的,因为页面没有重新加载;内容只是被覆盖。我的解决方案是在 turbolinks 呈现新页面之前销毁数据。

document.addEventListener('turbolinks:before-render', () => {
  delete window.progress;
})

请注意,delete 方法不适用于使用 var 声明的 javascript 变量,但对分配给 window 的属性有效,就像我的情况一样。如果使用 var,您需要执行 var progress = null;

a lot of options 知道在请求的生命周期中在哪里执行此操作。我选择了 before-render 以确保数据只有 'destroyed' 如果请求成功。