Rails:如果在同一窗口中访问,则在每个页面上运行特定于页面的javascript
我想为某个特定页面运行javascript。为此,我在布局文件中创建了元标记,如下所示:Rails:如果在同一窗口中访问,则在每个页面上运行特定于页面的javascript,javascript,ruby-on-rails,browser-cache,turbolinks,Javascript,Ruby On Rails,Browser Cache,Turbolinks,我想为某个特定页面运行javascript。为此,我在布局文件中创建了元标记,如下所示: <%= tag :meta, name: :psj, action: action_name, controller: controller_name %> 以下是我的javascript文件,用于需要在特定操作上运行的特定控制器: # scans.js $(document).on('turbolinks:load', function() { if (!(page.controller
<%= tag :meta, name: :psj, action: action_name, controller: controller_name %>
以下是我的javascript文件,用于需要在特定操作上运行的特定控制器:
# scans.js
$(document).on('turbolinks:load', function() {
if (!(page.controller() === 'scans' && page.action() === 'index')) { return; }
var ajax_call = function() {
$.get("/scans.js", { }, function(table) {
$("#scans").replaceWith(table);
});
}
var interval = 1000 * 60 * 1 ;
setInterval(ajax_call, interval);
});
这非常适合扫描#索引
页面。现在,在访问此页面后,如果我单击在同一窗口中加载其他页面的任何链接,ajax\u call
代码将运行,但不应如此
相反,如果我在不同的窗口中打开另一个页面,它可以正常工作(
ajax\u call
don run)。它是否与浏览器的缓存或turbolinks缓存有关,但不确定问题的原因。您遇到的问题是,您已检测turbolinks,但实际上并没有监听页面更改事件以操纵状态。也就是说,当页面更改时,您需要清除间隔。Turbolinks无法处理浏览器打开新窗口并导航到URL(例如超级+单击)的情况,因此它在这些情况下工作。请尝试以下操作:
document.addEventListener("turbolinks:load", function() {
let interval = null;
if ((page.controller() === 'scans' && page.action() === 'index')) {
let ajax_call = function() {
$.get("/scans.js", { }, function(table) {
$("#scans").replaceWith(table);
});
}
let interval = 1000 * 60 * 1 ;
interval = setInterval(ajax_call, interval);
}else{
if(interval){ clearInterval(interval) }
}
}
1) 使用WebSocket 2)如果没有任何更改,则不更新DOM 3)对
anything.js
的请求不应返回HTML,4)为什么不直接将其写入专用js文件并加载到所需的视图中?代码已经在单独的js文件中,为更清晰起见进行了编辑。如果您仅在视图中为扫描#索引
加载此文件,则不需要任何init.js
或scans.js中的条件文件。它是否与缓存相关联,更新question@RajMishraTurboLink无法捕获在特定的load
回调期间加载的所有JS,因此它们不会为您将其拆下。如果你需要这样做,就像你在这里做的那样,你需要自己去做。
document.addEventListener("turbolinks:load", function() {
let interval = null;
if ((page.controller() === 'scans' && page.action() === 'index')) {
let ajax_call = function() {
$.get("/scans.js", { }, function(table) {
$("#scans").replaceWith(table);
});
}
let interval = 1000 * 60 * 1 ;
interval = setInterval(ajax_call, interval);
}else{
if(interval){ clearInterval(interval) }
}
}