在页面之间共享document.ready javascript

时间:2014-07-29 18:44:21

标签: javascript jquery ruby-on-rails

我有很多$(function () {}); (document.ready)个javascript函数在我的不同网页中是相同的。但是我不知道如何“分享”它们,这样我就可以将它们保存在一个地方,而不必每次都复制+粘贴它们。

即。在Rails中,我尝试将一些共享代码放在我的javascript资源管道中,但它不会运行(除非我在加载后刷新页面一次)。但是,当前页面的唯一javascript确实会运行。

有什么想法吗?

更新

Saiqul的回答是有效的,但我最终做的和我最好的做法是:https://stackoverflow.com/a/18834209/3776339

2 个答案:

答案 0 :(得分:1)

你使用的是哪种导轨版本? 如果rails 4+,你需要更多文档事件监听器,如$(document).on('page:change', function(){})因为rails 4+使用turbolinks gem来加快页面加载速度,所以你的jQuery.ready()监听器只在第一页执行加载,不在另一个页面中工作。

turbolinks提供了一些活动:

  
      
  • page:before-change
  •   
  • page:fetch开始提取新的目标网页
  •   
  • page:receive页面已从服务器获取,但尚未解析
  •   
  • page:change页面已被解析并更改为新版本和DOMContentLoaded
  •   只要page:change是jQuery的ajaxSucess上的PLUS,如果jQuery可用(否则你可以在你自己的代码中调用XMLHttpRequest时手动触发它),
  • page:update被触发。
  •   
  • page:load在加载过程结束时被解雇。
  •   

或者您可以使用jquery.turbolinks gem,当Turbolinks触发页面时会触发jQuery.ready():load event。

更新

这是我在my rails app

中的js代码

我封装了必须在单个函数中的每个页面上运行的js代码

var ready = function(){
  $('somEl').on('change', function(){ 
    .... 
  });
  $('otherEl').on('click', function(){ 
    .... 
  });
});

然后执行三个事件监听器

$(document).ready(ready) // jquery event

$(document).on("page:fetch", function(){ // turbolinks event
  ready();

  // you can add more code here, which will be fired when turbolinks starting fecth new page
}
$(document).on("page:change", function(){  // turbolinks event
  ready();

  // you can add more code here too
}

答案 1 :(得分:0)

试试这个问题,看看是否有帮助: Include JavaScript in Ruby (on Rails)

此博客还讨论了如何最好地添加JS: Ruby on Rails layouts and JavaScript includes

还有一个谷歌搜索结果: Adding javascript to rails