2

在 Rails 上使用 ruby​​,我的代码由以下咖啡脚本触发;

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

在代码要触发的页面上,我有一个 divtarget和一个加载progress参数的脚本标签,例如

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

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

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

4

2 回答 2

3

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

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

请注意,该delete方法不适用于用 声明的 javascript 变量var,但window在我的情况下适用于分配给的属性。如果使用var,你会想做var progress = null

在请求的生命周期中,您有很多选择可以在哪里执行此操作。我选择了 before-render 以确保只有在请求成功时才“销毁”数据。

于 2016-12-30T07:51:49.360 回答
1

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

if $('#target').length > 0
于 2016-12-29T21:53:07.483 回答