Turbolinks加载事件在页面加载时不起作用。

4

我遇到一个问题,与目前默认的turbolinks推荐的加载事件有关

document.addEventListener('turbolinks:load', function() {
  …
});

发生的情况是,当页面加载时,在Safari上不会触发此操作。因此,我将 Turbolinks.dispatch(“turbolinks:load”); 添加到 application.js 中。它似乎工作正常。但是在Chrome上,它会自动触发,因此最终发生的是 turbolinks:load 事件双重触发。我的第一个解决方法是仅在非Chrome浏览器上触发 turbolinks:load。但不知何故,即使在Chrome上,有些视图也无法自动触发 turbolinks:load。所以我最后找到的解决方案是使用:
$(document).on('ready turbolinks:load', function() {
  …
});

这似乎解决了所有问题,因为它在第一次页面加载或重新加载时以及我点击链接时触发。它也可以在Chrome和Safari中触发。

是否有更好的处理方法?

文档说第一版是正确的,但情况似乎不是这样。

我错过了什么吗?

(注意:对我来说,使用jQuery并不是不利因素,我知道我可以使用几个document.addEventListener来实现这个功能)


你是怎么在Turbolinks中加载的?即页面上的脚本标签在哪里,而且你是否在 <script> 上使用了 async - Dom Christie
我正在以常规的Rails方式加载,使用资产管道。 然后我将它从body移动到head,并添加了async。将所有内容加载到一个js文件中(application.js),因此我不会遇到异步问题。 - lucasarruda
1个回答

4
正如评论中所述,您正在使用async 加载Turbolinks。目前,异步加载Turbolinks的效果并不好。因此,目前最好的建议是从脚本标记中删除async 属性,或者改用defer
为什么呢?Turbolinks监听第一次加载时的DOMContentLoaded 事件,然后触发turbolinks:load 。如果异步加载,在HTML被解析和DOMContentLoaded 触发之后,可以使脚本完成加载/执行。在这种情况下,turbolinks:load 将不会被触发。
目前还有一个GitHub问题讨论库实施一些可能的解决方案: https://github.com/turbolinks/turbolinks/issues/281

明白了,感谢回复。所以即使在application.js中加载turbolinks(它们都被捆绑在一起),使用异步仍然存在问题。那我应该使用defer吗?否则,我将不得不将其从头部移动,这样做就失去了意义。 - lucasarruda
谢谢回复。 我担心把代码放在<head>标签里,没有使用“defer”会导致首次加载时间增加,从而降低Google / SEO评分,你知道的。 我会进行一个带“defer”的测试。 - lucasarruda
它不是很大,不到300kb,但我认为从SEO/页面优化的角度来看,这是谷歌的强烈推荐。 - lucasarruda
值得一提的是,可以在Chrome中执行性能/SEO审核,以了解其对网页的影响有多大。就我负责的主要应用程序而言,我们不推迟脚本加载,并获得89的SEO得分和82的性能得分,因此这可能不会对Google排名产生重大影响。但是,application.js文件只有81.3 KB(经缩小和压缩后)。 - Dom Christie
会这样做。我很好奇你是否在Google Page Speed工具中看到了该建议。 - lucasarruda
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接