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

Posted

技术标签:

【中文标题】Rails javascript仅在重新加载后才有效【英文标题】:Rails javascript only works after reload 【发布时间】:2013-06-23 11:01:09 【问题描述】:

问题正是标题所说的。 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 .

这是咖啡脚本

$(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")

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

【问题讨论】:

我遇到了同样的问题,虽然我没有使用 CoffeeScript。 pastebin.com/d5QKXydy 【参考方案1】:

我猜这是一个 turbolinks 问题。

要么从您的项目中删除 turbolinks,要么将您的脚本修改为:

$(function() 
  initPage();
);
$(window).bind('page:change', function() 
  initPage();
);
function initPage() 
  // Page ready code...

正如提到的here。

【讨论】:

这个解决方案适用于我和 Rails 5,但我使用 'turbolinks:load' 而不是 'page:change'【参考方案2】:

这是一个 turbolinks 问题。感谢@zwippie 引导我朝着正确的方向前进! 解决方案是将我的咖啡脚本包装在:

ready = ->
// functions

$(document).ready(ready)
$(document).on('page:load', ready)

【讨论】:

那是咖啡脚本,它是函数的语法。 我不明白,你有没有把这个确切的代码放在你问题的代码之上?您选择了其中一项活动吗?您是否将一个嵌套在另一个中? 嗨@GiovanniDiToro,您需要做的是在page:load 事件之后运行代码。因此,在我的示例中,我将要运行的代码封装在一个名为 ready 的函数中,并将其添加为在 page:load 事件之后运行的回调。 @JasonCarty 我做到了,我通过 JQuery-> $(document).ready ->$(document).on 'turbolinks:load', -> 中的咖啡脚本调用。但我也发现在 IE 中它可以工作,但如果值为空,firefox 会自动完成......【参考方案3】:

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

【讨论】:

不再适用于 Rails 5。请参阅讨论 github.com/kossnocorp/jquery.turbolinks/issues/56 - gem 已被弃用。【参考方案4】:

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

 //= require jquery 
 //= require jquery.turbolinks 
 //= require jquery_ujs 
 //= require bootstrap-sprockets 
 //= require turbolinks

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

gem 'jquery-turbolinks'

【讨论】:

如果您有查询,然后是 turbo 链接,然后是 jquery.turbolinks,您将产生必须创建重新加载的条件。在我看来,这是最快、最便宜和正确的答案。添加 gem + 以正确的顺序插入 app/assets/javascript/application.js 中的 require 语句【参考方案5】:

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

CoffeeScript 代码:

$(document).on 'turbolinks:load', ->
  my_func()

JavaScript 代码:

document.addEventListener("turbolinks:load", function() 
  my_func();
)

【讨论】:

我有确切的问题,但我使用 C# 和 asp.net。您能否为此建议正确的脚本?谢谢 这是唯一适用于我的新 Rails 5 应用程序 @wolfQueen asp.net 和 C# 通常用于服务器端。您可能应该查看您的客户端文件(这可以在特定的 .js 文件上或在您的 html 中,具体取决于您要执行的操作) 完全相同的问题,我特别想弄清楚如何一次性修改 turbolink 负载。谢谢! 花了很长时间与这个搏斗。你的解决方案对我有用。【参考方案6】:

导轨 5 使用 jquery.turbolinks gem 并使用

$( document ).on('turbolinks:load', function() 
  // your code

【讨论】:

【参考方案7】:

我正在尝试 Rails 5.2,发现第一次加载页面时没有加载 'turbolinks:load'。这就是我需要在 CoffeeScript 文件中做的事情。

document.addEventListener('turbolinks:load', ->
  # ... CoffeeScript code here
)

if !Turbolinks?
  location.reload

Turbolinks.dispatch("turbolinks:load")

【讨论】:

【参考方案8】:

如果您使用诸如Clock Time Picker 之类的JQuery 插件,请首先使用jQuery document ready 函数,这会使您的脚本等到整个页面加载完毕后再尝试运行,然后您可以使用turbolinks:load 事件。

JQuery(function($) 
  $(document).on('turbolinks:load', function() 
    $('.time').clockTimePicker();
  );
);

最好位于您的app/assets/javascripts/... js 文件中

【讨论】:

以上是关于Rails javascript仅在重新加载后才有效的主要内容,如果未能解决你的问题,请参考以下文章

仅在我重新加载 django 服务器后才提供上传的媒体文件

Rails JavaScript 仅在您刷新页面时加载,而不是在原始页面加载时加载,这是怎么回事?

Rails 仅在生产时才在页面重新加载时丢失会话变量 current_user_id(React 16.13、Rails 6、Heroku)

Javascript/JQuery 直到页面重新加载后才工作

DataTables 仅在页面刷新时加载

令牌输入仅在我刷新页面后才有效