我对当前默认 Turbolinks 推荐的加载事件有疑问:
document.addEventListener('turbolinks:load', function() {
…
});
发生的情况是,当页面加载时,这不会在 Safari 上触发。因此我附加了Turbolinks.dispatch("turbolinks:load");
to application.js
.
看起来效果很好。但在 Chrome 上,它确实会自动触发,所以最终发生的是双重触发turbolinks:load
event.
我的第一个解决方法是开火turbolinks:load
仅在非 Chrome 浏览器上。
但不知何故,即使在 Chrome 上,某些视图也不会触发turbolinks:load
自动地。所以我最终也不得不在特定的视图上触发它。
我找到的最终解决方案是使用:
$(document).on('ready turbolinks:load', function() {
…
});
这似乎解决了所有问题,因为它在首页加载或重新加载以及单击链接时触发。它也会在 Chrome 和 Safari 上触发。
有更好的方法来处理这个问题吗?
文档说第一个版本是正确的,但情况似乎并非如此。
我错过了什么吗?
(注意:使用 jQuery 对我来说并不是一个缺点,我知道我可以通过一些方法来实现它document.addEventListener
)
正如评论中所指出的,您正在加载 Turbolinksasync
。 Turbolinks 目前在异步加载时无法正常工作。所以目前最好的建议是删除async
脚本标签中的属性,或使用defer
反而。
Why?
Turbolinks 监听DOMContentLoaded
第一次加载时触发的事件turbolinks:load
。通过异步加载,脚本有可能完成加载/执行afterHTML 已被解析并且DOMContentLoaded
被解雇了。在这种情况下,turbolinks:load
不会被解雇。
目前有一个 GitHub 问题讨论了库实施的一些可能的解决方案:https://github.com/turbolinks/turbolinks/issues/281 https://github.com/turbolinks/turbolinks/issues/281
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)