TLDR;以下是传统方法的工作原理
$(document).ready(function() {
$("#tbl-account").tableSorter();
});
一旦文档完成加载,它使用 jQuery 来初始化一个表格排序插件。这里值得注意的一点是当页面组件通过 Turbolink 切换时,该 js 不会被拆除和重新运行。没有。因为浏览器处理了清理工作,所以当天不需要回来。但是,在像 Turbolinks 这样的单页应用程序中,浏览器不会处理它。作为开发人员,您必须管理 JavaScript 行为的初始化和清理。
当人们尝试将传统的 Web 应用程序移植到 Turbolinks 时,他们经常会遇到问题,因为他们的 JS 永远不会自行清理。
所有 Turbolinks 友好的 JavaScript 都需要:
- 显示页面时自行初始化
- 在 Turbolinks 导航到新页面之前自行清理。
捕获事件
Turbolinks 提供了自己的事件,您可以捕获这些事件来设置和拆除 JavaScript。让我们从拆解开始:```js document.addEventListener('turbolinks:before-render', () => { Components.unloadAll(); }); ``` `turbolinks:before-render` 事件在除第一个页面浏览之外的每个页面浏览之前触发。这是完美的,因为在第一次综合浏览量上没有什么可拆除的。
初始化的事件稍微复杂一些。我们希望我们的事件处理程序运行:
- 在初始页面加载时
- 在任何后续访问新页面时,以下是我们捕获这些事件的方式:
// Called once after the initial page has loaded
document.addEventListener(
'turbolinks:load',
() => Components.loadAll(),
{
once: true,
},
);
// Called after every non-initial page load
document.addEventListener('turbolinks:render', () =>
Components.loadAll(),
);
感谢 Starr Horne 撰写有关从 jquery/pjax 迁移到 turbolinks 的文章