Turbolinks在加载下一页内容之前调用“加载”脚本

时间:2018-08-08 16:55:25

标签: ruby-on-rails-5 turbolinks

具有:
-页面A是纯HTML没有脚本;
-页面B在Turbolinks“ turbolinks:load”事件中包含一些Javascript。

正在加载页面B,并在“ turbolinks:load”上正确运行脚本。 现在我在页面B上,然后单击指向页面A的链接。这一次在加载页面A内容之前触发了来自“ turbolinks:load”的脚本。

是错误还是某些定义的行为?

要复制的示例简单Rails代码。
控制器:

$result = [];
foreach ($list as $key => $value) {
    if (preg_match('/\bthis.+?description/', $value["description"])) {
        $result[$key] = $key;
    }
}

print_r($result);

路线:

private CountDownTimer countDownTimer;

public void startCount(){

countDownTimer = new CountDownTimer(SECONDS_TO_DISMISS, 1000) {

            @Override
            public void onTick(long time) {
               strong text
            **strong text**
            }

            @Override
            public void onFinish() {

            }

        }.start();
}

public void stopCount(){
    countDownTimer.cancel();
}

观看次数:

#app/controllers/turbobugs_controller.rb
class TurbobugsController < ApplicationController
  def a
    render layout: false
  end

  def b
  end
end

namespace :turbobugs do
  get :a
  get :b
end

打开B页并在控制台中查看:

#app/views/turbobugs/a.html.haml
%h1
  No scripts here
= link_to turbobugs_b_path, turbobugs_b_path

然后点击链接到A页并在日志中查看:

#app/views/turbobugs/b.html.haml
= link_to turbobugs_a_path, turbobugs_a_path
%script
  document.addEventListener("turbolinks:load", function() { console.log('I am script in page B running on window.location: ' + window.location); });

为什么:)?

还请注意,该脚本实际上在B页内容上真正开始运行,但是在A加载(或开始加载等)之前终止(如果花费的时间太长或某些Ajax异步)。

1 个答案:

答案 0 :(得分:1)

这是定义的行为。假设您的资产标签(JS或CSS)具有data-turbolinks-track="reload"属性,当它注意到页面A上没有脚本时,Turbolinks会完全重新加载页面。根据Turbolinks README

  

这可确保用户始终拥有应用程序脚本和样式的最新版本。

您可以通过从资产标签中删除data-turbolinks-track="reload"来更改此行为,但是请注意以上几点。

根据观察到的日志记录行为,Turbolinks会为每次访问执行特定的过程。对于这种情况,可以大致概括为:

  1. 请求新内容
  2. 更改网址
  3. 检查跟踪元素中的任何差异
  4. 如果存在差异,请完全重新加载,否则请重新呈现新内容
  5. 运行complete函数

complete过程的一部分是触发turbolinks:load,即使重新加载页面,该事件仍会在事件发生之前 just 触发。


请注意,在使用Turbolinks时,将事件侦听器添加到内联脚本中可能会导致某些意外行为。

传统上,内联脚本已指示该代码仅在给定页面上执行-当用户从一个位置导航到另一个位置时,事件侦听器将被销毁。使用Turbolinks时情况并非如此,除非将事件侦听器删除,否则它们会一直挂着。

例如,如果您在内联脚本中添加turbolinks:load的事件侦听器,它将在每次后续页面加载时执行,除非将其删除。此外,如果用户使用内联脚本重新访问该页面,则监听器将再次 被绑定,从而导致处理程序被多次调用。