具有:
-页面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异步)。
答案 0 :(得分:1)
这是定义的行为。假设您的资产标签(JS或CSS)具有data-turbolinks-track="reload"
属性,当它注意到页面A上没有脚本时,Turbolinks会完全重新加载页面。根据Turbolinks README:
这可确保用户始终拥有应用程序脚本和样式的最新版本。
您可以通过从资产标签中删除data-turbolinks-track="reload"
来更改此行为,但是请注意以上几点。
根据观察到的日志记录行为,Turbolinks会为每次访问执行特定的过程。对于这种情况,可以大致概括为:
complete
函数 complete
过程的一部分是触发turbolinks:load
,即使重新加载页面,该事件仍会在事件发生之前 just 触发。
请注意,在使用Turbolinks时,将事件侦听器添加到内联脚本中可能会导致某些意外行为。
传统上,内联脚本已指示该代码仅在给定页面上执行-当用户从一个位置导航到另一个位置时,事件侦听器将被销毁。使用Turbolinks时情况并非如此,除非将事件侦听器删除,否则它们会一直挂着。
例如,如果您在内联脚本中添加turbolinks:load
的事件侦听器,它将在每次后续页面加载时执行,除非将其删除。此外,如果用户使用内联脚本重新访问该页面,则监听器将再次 被绑定,从而导致处理程序被多次调用。