【问题标题】:Disabling turobolinks to serve page specific javascript禁用 turobolinks 以提供特定于页面的 javascript
【发布时间】:2016-09-06 17:52:01
【问题描述】:
我在 Rails 5.0.0.1 中使用 Turbolinks 有一个高度交互的事件驱动页面。
在不同的页面上有不同的交互,像 window.resize 这样的事件会在我不需要的页面上触发。
是否值得通过禁用 Turbolinks 来提供特定于页面的 javascript 来牺牲导航时间,或者我是否应该不在乎而只使用 Jquery 中的 if 语句来检查某些元素是否存在于使用其 ID 的页面中。
rails 的方法是什么?
【问题讨论】:
标签:
javascript
jquery
ruby-on-rails
ruby
turbolinks
【解决方案1】:
不建议提供页面特定资产,例如 javascript。这会减慢用户体验,因为导航到新页面会触发另一个资产下载。
Rails 资产管道的全部意义在于收集您的资产、缩小它们并将它们全部连接到一个文件中,浏览器只下载一次,即用户第一次导航到您的页面时。
是的,使用 jQuery 检查某些元素是否存在以运行某些行为。
我发现有用的方法是不要将 js 行为视为特定于页面,而是特定于小部件。例如如果 DOM 中有一个可排序的表,则初始化可排序的表小部件,即$(".sortable").sortable()
以上示例使用jQuery plugins 模式。将您的行为/小部件逻辑放在 jQuery 插件中,它只会在选择器找到元素时运行,例如$("#nonexistant").something()、something() 不会被调用。 $("#definitelyExists").somethingElse(), somethingElse() 将被调用。
在前面的示例中,当找到一个元素并调用函数时,函数的this 引用匹配的元素,您可以在它们上运行您的行为逻辑。