【问题标题】:Bootstrap 3 dropdown doesn't work with Rails 4 & TurbolinksBootstrap 3 下拉菜单不适用于 Rails 4 和 Turbolinks
【发布时间】:2014-11-25 18:19:26
【问题描述】:

我最近将我的网站升级到 Bootstrap 3,并且正在检查所有布局以更新类名和各种功能以使其正常工作。我最近的问题是下拉菜单似乎不起作用。起初我以为我没有为导航栏正确实现代码,但在感到沮丧之后,我实际上尝试摆脱导航栏并直接使用BS 3 documentation 中的一个。即使那个代码也不起作用。我已经对此进行了调查,并且相当确定我已经加载了所有正确的 .js 库。这是我的 application.js:

//= require jquery
//= require bootstrap-sprockets
//= require jquery.ui.datepicker
//= require jquery.timepicker.js
//= require jquery_ujs
//= require turbolinks
//= require bootstrap
//= require jquery.remotipart
//= require chosen-jquery
//= require_tree .

这是我的<head> 中出现的内容:

  <script data-turbolinks-track="true" src="/assets/jquery.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/bootstrap/affix.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/bootstrap/alert.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/bootstrap/button.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/bootstrap/carousel.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/bootstrap/collapse.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/bootstrap/dropdown.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/bootstrap/tab.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/bootstrap/transition.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/bootstrap/scrollspy.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/bootstrap/modal.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/bootstrap/tooltip.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/bootstrap/popover.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/bootstrap-sprockets.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.core.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.ui.datepicker.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.timepicker.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery_ujs.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/turbolinks.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/bootstrap.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.iframe-transport.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery.remotipart.js?body=1"></script>

我在同一页面上有弹出框和其他可折叠项目,并且一切正常,所以我相当确定所有 .js 都完好无损。

我在其他地方读到 turbolinks 会给 Bootstrap 3 带来问题,甚至尝试过(然后放弃并恢复)jquery.turbolinks gem 无济于事。不用说,我不知道如何在 jsfiddle 上重现这个(对不起)。

最后我验证了一下,每次点击下拉都会调用以下四个js函数,大概是这样的:

jquery.js:4306

            eventHandle = elemData.handle = function( e ) {
                // Discard the second event of a jQuery.event.trigger() and
                // when an event is called after a page has unloaded
                return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ?
                    jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
                    undefined;
            };
            // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
            eventHandle.elem = elem;

turbolinks.js:324

    installClickHandlerLast = function(event) {
        if (!event.defaultPrevented) {
            document.removeEventListener('click', handleClick, false);
            return document.addEventListener('click', handleClick, false);
        }
    };

tujquery.js:4306(再次)

turbolinks.js:324

    handleClick = function(event) {
        var link;
        if (!event.defaultPrevented) {
            link = extractLink(event);
            if (link.nodeName === 'A' && !ignoreClick(event, link)) {
                visit(link.href);
                return event.preventDefault();
            }
        }
    };

知道这里可能发生了什么以及如何解决吗?

【问题讨论】:

    标签: jquery ruby-on-rails twitter-bootstrap twitter-bootstrap-3 turbolinks


    【解决方案1】:

    在 twbs github 上查看这个答案:https://github.com/twbs/bootstrap-sass/issues/714

    【讨论】:

      【解决方案2】:

      我在turbolinks issues with bootstrap modal回答了这个问题

      简而言之:您需要jquery-turbolinks gem。

      【讨论】:

      • 如果使用 Rails 4.2.0,使用这个 gem 会导致奇怪的引导行为,看起来 rails 4.2.0 turbolinks 运行良好。
      【解决方案3】:

      无需使用jquery-turbolinks 即可解决此问题。您需要首先了解为什么会发生这种情况。当 turbolinks 被启用并且你点击一个链接时,page:change 事件被触发并且所有的 javascript 都会从新加载的 html 中重新评估。

      这包括在application.js 中加载的引导JavaScript 代码。当引导程序的 javascript 重新加载时,它会中断。您可以通过在 application.js 中的 &lt;script&gt; 标签中使用 data-turbolinks-eval=false 来解决此问题。

      对于 ERB:

      <%= javascript_include_tag 'application', 'data-turbolinks-eval' => false %>
      <%= javascript_include_tag params[:controller] %>
      

      对于苗条:

      == javascript_include_tag 'application', 'data-turbolinks-eval': false
      == javascript_include_tag params[:controller]
      

      【讨论】:

      • 很好的解决方案。我开始在页面更改时手动重新调用我的所有引导 javascript 函数,但有了这个我不必这样做。
      • 对于 Webpacker:&lt;%= javascript_pack_tag 'application', 'data-turbolinks-eval': false %&gt;
      【解决方案4】:

      我能够通过将“data-turbolinks-eval”=> false 添加到我的 Bootstrap CDN 链接来解决问题。

      <%= javascript_include_tag 
        "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js", 
        "data-turbolinks-eval" => false 
      %>
      

      【讨论】:

        【解决方案5】:

        您没有使用 turbolinks 的好方法。 turbolink 不应与资产一起使用。 使用turbolinks的方法可以看这里: Handling Turbolinks and JS incompatibility in Rails

        您不应更改任何 javascript_links。只需在App/assets/javascripts/application.js 中输入如下代码:

        //= require jquery
        //= require jquery.turbolinks
        //= require jquery_ujs
        //
        // ... your other scripts here ...
        //
        //= require turbolinks
        

        在将 jquery-turbolinks 放入 Gemfile 之后。 bootstrap require 应该位于 jquery.turbolinks 和 turbolinks 之间。

        【讨论】:

        • 您应该在答案中包含链接中的相关数据,而不是只提供链接。
        猜你喜欢
        • 2021-06-20
        • 2020-03-08
        • 2021-08-16
        • 2023-03-10
        • 1970-01-01
        • 2018-08-09
        • 1970-01-01
        • 1970-01-01
        • 2019-08-27
        相关资源
        最近更新 更多