Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rails:如果在同一窗口中访问,则在每个页面上运行特定于页面的javascript_Javascript_Ruby On Rails_Browser Cache_Turbolinks - Fatal编程技术网

Rails:如果在同一窗口中访问,则在每个页面上运行特定于页面的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

我想为某个特定页面运行javascript。为此,我在布局文件中创建了元标记,如下所示:

<%= 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) }
  }
}