主要修订
在 Bootstrap Native 开发团队的一名成员接受了答案之后,我修改了我在我的应用程序中实现的解决方案。我的解决方案与公认的解决方案略有不同,因为我的侦听器将在整个 DOM 中搜索 Bootstrap 组件。相比之下,公认的解决方案只会在包含id="myContainer
. 接受的解决方案将执行得更快,因为它只搜索 DOM 的一个子集。但是,它需要开发人员将相关的 Bootstrap 组件包装在带有myContainer
id 的标签中。
任何一种解决方案都有效。我的解决方案运行速度会慢一些,但会导致编码更容易,并且不太容易出现开发人员引发的错误。以下是详细信息:
应用程序/资产/javascript/application.js
//= require turbolinks
//= require rails-ujs
//= require polyfill
//= require bootstrap-native
//= require bootstrap-native-turbolinks
应用程序/资产/javascript/bootstrap-native-turbolinks.js
document.addEventListener('turbolinks:load', function(){
Array.prototype.forEach.call(document.querySelectorAll('[data-spy="affix"]'), function(element){ new Affix(element) });
Array.prototype.forEach.call(document.querySelectorAll('[data-dismiss="alert"]'), function(element){ new Alert(element) });
Array.prototype.forEach.call(document.querySelectorAll('[data-toggle="buttons"]'), function(element){ new Button(element) });
Array.prototype.forEach.call(document.querySelectorAll('[data-ride="carousel"]'), function(element){ new Carousel(element) });
Array.prototype.forEach.call(document.querySelectorAll('[data-toggle="collapse"]'), function(element){ new Collapse(element) });
Array.prototype.forEach.call(document.querySelectorAll('[data-toggle="dropdown"]'), function(element){ new Dropdown(element) });
Array.prototype.forEach.call(document.querySelectorAll('[data-toggle="modal"]'), function(element){ new Modal(element) });
Array.prototype.forEach.call(document.querySelectorAll('[data-toggle="popover"]'), function(element){ new Popover(element) });
Array.prototype.forEach.call(document.querySelectorAll('[data-spy="scroll"]'), function(element){ new ScrollSpy(element) });
Array.prototype.forEach.call(document.querySelectorAll('[data-toggle="tab"]'), function(element){ new Tab(element) });
Array.prototype.forEach.call(document.querySelectorAll('[data-toggle="tooltip"]'), function(element){ new Tooltip(element) });
},false);
供应商/资产/javascripts/
最后,我将我的应用程序 javascript 标记移至<head>
并在没有 tuborlinks-eval 和 turbolinks-track 的情况下异步加载它。这将 Javascript 配置为在初始页面加载时运行一次。turbolinks:load
每次访问 turbolinks 页面时都会调用该侦听器,并将 Bootstrap Native 事件侦听器附加到 DOM 中的适当组件。
应用程序/视图/布局/application.html.erb
...
<head>
...
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload', 'data-turbolinks-eval': 'false', async: true %>
</head>
...
在撰写本文时,此解决方案位于生产 Rails 5.1 应用程序中。
顺便说一句,在application.js中列出的所有 Javascript ,当连接和缩小时,都小于 20KB。相比之下,jQuery本身缩小了 86KB。 Bootstrap Native可以显着缩短应用程序的下载时间。