Rails javascript仅在重新加载后才有效

Jas*_*rty 53 javascript ruby-on-rails ruby-on-rails-3 asset-pipeline

问题正是标题所说的.javaScript位于资产管道中,即assets/javascripts/myfile.js.coffee在application.js中我有:

//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require jquery.ui.all
//= requier twitter/bootstrap
//= require jasny-bootstrap
//= require_tree .
Run Code Online (Sandbox Code Playgroud)

这是coffeescript

$(document).ready ->
  $("#close").click ->
    $(this).parent().parent().slideUp("slow")




  $( "#datepicker" ).datepicker
    dateFormat : "yy-mm-dd"


  player_count = $("#player option").length


  $('#btn-add').click ->
    $('#users option:selected').each ->
      if player_count >= 8
        $('#select-reserve').append("<option      value='"+$(this).val()+"'>"+$(this).text()+"</option>")
        $(this).remove()    
      else
        $('#player').append("<option value='"+$(this).val()+"'>"+$(this).text()+"</option>")
        $(this).remove()
        player_count++


  $('#btn-remove').click ->
    $('#player option:selected').each ->
      $('#users').append("<option value='"+$(this).val()+"'>"+$(this).text()+"</option>")
      $(this).remove()
      player_count--


  $('#btn-remove-reserve').click ->
    $('#select-reserve option:selected').each ->
      $('#users').append("<option value='"+$(this).val()+"'>"+$(this).text()+"</option>")
      $(this).remove()


  $("#submit").click ->
   $("select option").prop("selected", "selected")
Run Code Online (Sandbox Code Playgroud)

我可以在浏览器的源代码中看到javaScript已经加载,但它只在我重新加载页面后才能工作.

Mar*_*ris 66

对于turbolinks 5.0,您必须使用turbolinks:load事件,这是第一次在页面加载时调用,每次在turbolink访问时调用.更多信息:https://github.com/turbolinks/turbolinks#running-javascript-when-a-page-loads

CoffeeScript代码:

$(document).on 'turbolinks:load', ->
  my_func()
Run Code Online (Sandbox Code Playgroud)

JavaScript代码:

document.addEventListener("turbolinks:load", function() {
  my_func();
})
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一一款适用于我的新rails 5 app (2认同)

Jas*_*rty 29

这是一个涡轮问题.感谢@zwippie带领我朝着正确的方向前进!解决方案是将我的coffeescript包装成:

ready = ->
// functions

$(document).ready(ready)
$(document).on('page:load', ready)
Run Code Online (Sandbox Code Playgroud)

  • 多数民众赞成coffeescript,它的功能语法. (3认同)

zwi*_*pie 24

我想这是一个涡轮问题.

从项目中删除turbolinks或将脚本修改为:

$(function() {
  initPage();
});
$(window).bind('page:change', function() {
  initPage();
});
function initPage() {
  // Page ready code...
}
Run Code Online (Sandbox Code Playgroud)

如前所述这里.


小智 19

您可以安装jquery.turbolinks gem来解决问题,而无需更改您的Javascript.

  • 不再适用于Rails 5.请参阅讨论https://github.com/kossnocorp/jquery.turbolinks/issues/56 - 宝石已被弃用. (4认同)

Pea*_*arn 9

您可以将jquery.turbolink放置在正确的位置

 //= require jquery 
 //= require jquery.turbolinks 
 //= require jquery_ujs 
 //= require bootstrap-sprockets 
 //= require turbolinks
Run Code Online (Sandbox Code Playgroud)

在Gemfile中你可以安装jquery-turbolinks gem

gem 'jquery-turbolinks'
Run Code Online (Sandbox Code Playgroud)


Bra*_*rad 6

Rails 5使用jquery.turbolinks gem并使用

$( document ).on('turbolinks:load', function() {
  // your code
}
Run Code Online (Sandbox Code Playgroud)