【问题标题】:jQuery dropdown menu not working second timejQuery下拉菜单第二次不起作用
【发布时间】:2016-09-09 21:57:59
【问题描述】:

我在 Rails 应用程序中使用 jQuery 来创建下拉菜单。起初我以为是链轮问题。 我的 nav.html.erb 文件中的代码是:

<nav>
  <%= link_to '#', class: 'toggle' do %>
    <i class="fa fa-bars"></i>
    <span>Menu</span>
  <% end %>
    <ul class = "menu-items">
      <li>
        <%= link_to root_path do %>
          <span>Home</span>
        <% end %>
      </li>
      <li>
        <%= link_to about_path do %>
          <span>About</span>
        <% end %>
      </li>
      <li>
        <%= link_to projects_path do %>
          <span>Projects</span>
        <% end %>
      </li>
      <li>
        <%= link_to blogs_path do %>
          <span>Blog</span>
        <% end %>
      </li>
      <li>
        <%= link_to contact_path do %>
          <span>Contact</span>
        <% end %>
      </li>
    </ul>
</nav>

我的 nav.js 文件中的代码是:

$(document).ready(function() {
    var $switch = $('a.toggle'),
        $menu = $('nav ul.menu-items'),
        $icon = $('nav a.toggle i');

   $switch.on('click', function(e){
     e.preventDefault();
     $menu.toggle(function(){
     $icon.toggleClass('fa-bars fa-times');
   });

 });
});

当我刷新页面时,我按下菜单导航栏,它会显示下拉菜单。我可以单击其中一个菜单项并将被重定向到该页面。在新页面上,我再次单击菜单栏,我得到了它的默认行为,它只是在 url 中添加了“#”。

我认为这与 document.ready 函数有关。在页面刷新时,document.ready 函数会运行,但在我单击菜单项时从页面重定向后不会运行。

【问题讨论】:

  • 尝试$(function() { 而不是$(document).ready(function() {。 jQuery 3 弃用了这种语法,因为有时它有奇怪的行为。 api.jquery.com/ready
  • 刚试过。相同的行为。

标签: javascript jquery html css ruby-on-rails


【解决方案1】:

感谢 luissimo,我查看了您提到的页面:更改问题并在此处找到了解决方案。 Rails 4: how to use $(document).ready() with turbo-links 它把我带到了铁轨指南: http://guides.rubyonrails.org/working_with_javascript_in_rails.html#how-turbolinks-works

$(document).on ('turbolinks:load', function() {
  var $switch = $('a.toggle'),
  $menu = $('nav ul.menu-items'),
  $xburger = $('nav a.toggle i');

  $switch.on('click', function(e){
    e.preventDefault();
    $menu.toggle(function(){
      $xburger.toggleClass('fa-bars fa-times');
    });

  });
});

我的响应式导航栏现在工作正常。 这是RTFM的经典案例。

【讨论】:

    【解决方案2】:

    这是因为 Turbolinks 会在每次单击链接时发生 page:change 事件,因此它每次都会重新评估 Javascript。这就是它一开始可以工作的原因,但是当您更改页面时,它可能会出现功能障碍。这是最简单的解决方法。

     <script>
       $('.toggle').dropdown()
     </script>
    

    您也可以在application.html.erb的&lt;script&gt;标签中添加data-turbolinks-eval=false,以中断点击链接后的重新评估。

    像这样:

    &lt;%= javascript_include_tag 'application', 'data-turbolinks-track' =&gt; true %&gt; 更改为&lt;%= javascript_include_tag 'application', 'data-turbolinks-eval' =&gt; false %&gt;.

    【讨论】:

    • 我在哪里添加 $('.toggle').dropdown() 行。在 nav.js 或 application.html.erb 文件中?
    • 放在正文末尾的application.html.erb中
    猜你喜欢
    • 2015-11-25
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-18
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多