【问题标题】:jQuery is not loading with Ruby on RailsjQuery 未使用 Ruby on Rails 加载
【发布时间】:2017-10-30 00:56:37
【问题描述】:

在 Ruby on Rails 中加载 Javascript 文件(包括 jQuery)时遇到问题。

$(document).ready(main);

var contador = 1;

function main(){
  $('.menu_bar').click(function(){

    if(contador == 1){
      $('nav').animate({
        left: '0'
      });
      contador = 0;
     } else {
        contador = 1;
        $('nav').animate({
          left: '-100%'
        });
       }
    });
  };

正确的 html.erb 如下所示:

<header>
  <div class="menu_bar">
    <a href="#" class="bt-menu"><span class="fa fa-bars"></span>Brand</a>
  </div>
  <nav>
    <ul>
      <li><%= link_to "Link 1", '#'%></li>
      <li><%= link_to "Link 2", '#'%></li>
      <li><%= link_to "Link 3", '#'%></li>
    </ul>
  </nav>
</header>

正确的 application.js 包括:

//= require rails-ujs
//= require turbolinks
//= require jquery
//= require jquery_ujs
//= require_tree .

jquery 来自 Gemfile 中的 gem 'jquery-rails'

点击后动画未加载。我正在使用 Rails 5,我猜这个问题是由 Turbolinks 发出的。

为了解决这个问题,我需要做些什么改变?

【问题讨论】:

  • 如果您认为问题是 turbolinks,请尝试使用 $('.menu_bar').on('click', function() { ... 而不是 $('.menu_bar').click(function(){ ...。您是否在控制台中遇到任何错误?
  • 感谢您的回答。它没有解决它,我在控制台中没有错误。
  • 如果您在控制台中没有收到任何错误,则 jQuery 正在加载(否则您会看到类似“ready is undefined”的内容)。错误可能是您的代码中的其他内容(可能在您的 CSS 中) - 代码本身似乎可以工作:jsfiddle.net/jzghgzot 可能尝试在main() 中添加$('nav').css('position', 'relative');。 (您也可以尝试分享更多信息,例如 HTML、JS 和 CSS)
  • 我尝试添加$('nav').css('position', 'relative');,但它不起作用。 html.erb 在描述中被编辑。 CSS 工作正常:jsfiddle.net/wy6fxoaj.
  • 在你的主函数中添加console.log('abc'),看看它是否被正确调用,如果当时不工作,试试$(document).ready(main); $(document).on('turbolinks:load', main);到你的javascript文件

标签: javascript jquery ruby-on-rails turbolinks


【解决方案1】:

Turbolinks 会尝试跟踪每个链接(即使是#,在这种情况下它只会重新加载页面)。你有几种方法可以解决这个问题。

选项 1: 将您的链接更改为没有任何 href:

<div class="menu_bar">
  <a class="bt-menu"><span class="fa fa-bars"></span>Brand</a>
</div>

选项 2: 停止传播事件,使其不会到达 turbolink:

$('.menu_bar a').click(function(e) {
  e.preventDefault();
  console.log("I HAVE BEEN CLICKED");
  // Rest of code here...
  return false;
});

选项 3:“告诉”turbolink 不要关注# 链接:

$(document).on('turbolinks:click', function (event) {
  if (event.target.getAttribute('href').charAt(0) === '#') {
    return event.preventDefault();
  }
});

如果它不起作用,请在代码中添加几个console.log 以找出它没有到达哪个部分。 CSS 可能存在一些问题(未共享,因此我们无能为力),但它可能需要相对或绝对位置来移动 nav

希望这能让您朝着正确的方向前进,如果它不起作用以及您在调试后发现了什么,请告诉我,我会更新我的答案。

【讨论】:

  • 完美!非常感谢。
【解决方案2】:

这样做,最后删除rails-ujsrequire turbolink,并在turbolinks之前要求所有文件。不要使用require .

//= require jquery
//= require jquery_ujs
//= require each one of your files on the order you want to load the !!!
//= require turbolinks

然后在这段代码中包含js加载函数

$(document).on('turbolinks:load', function() {
    main();
}

function main(){
    // Include your code
    };

另一个问题是,你是否在这个函数中设置了一个断点并确保它没有被调用?

$('.menu_bar').click(function(){
       // breakpoint
});

是的,console.log('abc') 被正确调用。 – L.S.Koy

@L.S.Koy 你错了。如果您有 turbolinks 工作 console.log 将不会被正确调用。 $(document).ready(main) 函数只会在整页刷新时调用 main() 函数,因为 turbolinks 会缓存页面,因此当您单击链接时它不会进行整页刷新,因此您的 $(document).ready 不会运行。这意味着如果您单击link,您的$(document).ready 不会运行并且不会执行包含您要运行的js 代码的function() { main(); }

要在所有turbolinks events上正确执行你的js代码,你需要使用

$(document).on('turbolinks:load', function() {
    main();
}

【讨论】:

  • 我已经按照您说的尝试过,但它不起作用。当我在$('.menu_bar').click(function() {... 之后添加console.log('abc') 时,单击后控制台中肯定会显示“abc”。我尝试过的另一件事:如果我删除 //= require turbolinks 并将 js 加载函数重新更改为 $(document).ready(main); 它突然工作正常。但为什么它不适用于 turbolinks?
  • @L.S.Koy 您没有触发页面更改。这就是您的点击有效的原因。因为如果您更改页面并且不刷新页面,turbolinks 会破坏您的链接。我是正确的。你相信我吗?
  • 我当然相信你,但我不明白为什么它仍然不能与 turbolinks 一起使用。我也试过this
猜你喜欢
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多