猿问

使用 turbolink 以编程方式打开 Bootstrap 选项卡

我正在尝试在页面加载后打开Bootstrap 4选项卡。如果我刷新页面,它确实有效,但是如果我在站点内导航,我会收到一个查询选择器空错误。


这是我的代码,这基本上是我 https://webdesign.tutsplus.com/tutorials/how-to-add-deep-linking-to-the-bootstrap-4-tabs-component--cms-31180 做的一个移植,因为我使用的是Bootstrap-native,所以我不得不用vanilla Javascript重写它。


  document.addEventListener("turbolinks:load", function() {

    let url = location.href.replace(/\/$/, "");

    if (location.hash) {

      const hash = url.split("#");

      document.querySelector('#nav-tab a[href="#'+hash[1]+'"]').Tab.show();

      url = location.href.replace(/\/#/, "#");

      history.replaceState(null, null, url);

      setTimeout(() => {

        window.scrollTo(0,0);

      }, 400);

    }

  });

我把它放在结束身体标签之前。如果我写入并单击刷新,则页面刷新和选项卡将更改,但是如果我从(turbo)链接到达那里,则找不到要查询选择的选项卡。恐怕问题出在“load”事件上,我尝试了不同的方法,但我无法让它工作。http://www.myURL#mytab


慕田峪9158850
浏览 82回答 1
1回答

皈依舞

如果要将此代码包含在 末尾的 中,则可能不需要侦听该事件。为什么?在第一次加载时,浏览器将能够查询位于脚本元素之前的任何元素。在 Turbolinks 上,加载脚本时将有权访问页面上所有呈现的元素。<script><body>turbolinks:load<body>值得补充的是,通过调用 body 元素,侦听器将在每次后续页面加载时调用,而不仅仅是在呈现脚本的页面上。如果后续页面加载中不存在这些元素,您将看到该错误。更重要的是,如果你在多个页面上包含脚本,那么监听器就会一次又一次地重复,这可能不是你想要的!document.addEventListener("turbolinks:load", …)<script>#nav-tabquerySelector因此,解决问题的第一步是删除事件侦听器。我们将你的代码包装在一个立即调用的函数中,以防止污染全局范围:;(function() {&nbsp; let url = location.href.replace(/\/$/, "");&nbsp; if (location.hash) {&nbsp; &nbsp; const hash = url.split("#");&nbsp; &nbsp; document.querySelector('#nav-tab a[href="#'+hash[1]+'"]').Tab.show();&nbsp; &nbsp; url = location.href.replace(/\/#/, "#");&nbsp; &nbsp; history.replaceState(null, null, url);&nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; window.scrollTo(0,0);&nbsp; &nbsp; }, 400);&nbsp; }})();接下来要知道的是,Turbolinks管理自己的访问页面缓存,因此当用户点击“返回”时,将从此缓存中呈现页面。为此,它有一个系统可以添加到浏览器自己的堆栈中。如果您绕过Turbolinks系统,并自己调用(或),那么您最终可能会破坏“返回”导航。Turbolinks没有记录在案的手动添加到其历史记录堆栈的方法,但您可以尝试以下操作:historyhistory.replaceStatehistory.pushState;(function() {&nbsp; let url = location.href.replace(/\/$/, "");&nbsp; if (location.hash) {&nbsp; &nbsp; const hash = url.split("#");&nbsp; &nbsp; document.querySelector('#nav-tab a[href="#'+hash[1]+'"]').Tab.show();&nbsp; &nbsp; url = location.href.replace(/\/#/, "#");&nbsp; &nbsp; Turbolinks&nbsp; &nbsp; &nbsp; .controller&nbsp; &nbsp; &nbsp; .replaceHistoryWithLocationAndRestorationIdentifier(url, Turbolinks.uuid())&nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; window.scrollTo(0,0);&nbsp; &nbsp; }, 400);&nbsp; }})();请注意,这是未记录的,因此可能不会在将来的版本中公开提供。最后,可能值得考虑将此代码段包含在主应用程序 JavaScript 捆绑包中,并将其加载到而不是正文中。在这种情况下,您需要使用'turbolinks:load处理程序。它可能看起来像这样:<head>document.addEventListener('turbolinks:load', function () {&nbsp; let url = location.href.replace(/\/$/, "");&nbsp; const hash = url.split("#");&nbsp; const navLink = document.querySelector('#nav-tab a[href="#'+hash[1]+'"]')&nbsp; if (location.hash && navLink) {&nbsp; &nbsp; navLink.Tab.show();&nbsp; &nbsp; url = location.href.replace(/\/#/, "#");&nbsp; &nbsp; Turbolinks&nbsp; &nbsp; &nbsp; .controller&nbsp; &nbsp; &nbsp; .replaceHistoryWithLocationAndRestorationIdentifier(url, Turbolinks.uuid())&nbsp; &nbsp; setTimeout(() => {&nbsp; &nbsp; &nbsp; window.scrollTo(0,0);&nbsp; &nbsp; }, 400);&nbsp; }});
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答