برنامه نویسی

موقعیت اسکرول را در Turbo بدون داده-turbo-permanent حفظ کنید

بسیار خوب، این برای آینده من کوتاه و شیرین خواهد بود.

حفظ موقعیت اسکرول بسیار دردناک است.

برخی از مقالات مانند این را شما اضافه کرده اید data-turbo-permanent: https://dev.to/mikerogers0/persist-scroll-positions-with-hotwire-turbo-1ihk

چرا که نه data-turbo-permanent? خوب، در مورد ما یک نوار کناری با یک پیوند برجسته برای صفحه فعلی داشتیم، که به این معنی است که کلیک روی پیوند هرگز اجازه به‌روزرسانی پیوند فعلی را نمی‌دهد. راه‌حل‌هایی وجود داشت که می‌توانستیم انجام دهیم، اما تصمیم گرفتیم این کار را نکنیم.

این مشکل GitHub نیز وجود دارد که راه‌حل‌های زیادی دارد:

https://github.com/hotwired/turbo/issues/37

چند قطعه در آنجا وجود دارد که بسیار نزدیک به این است. این چیزی است که اخیراً استفاده کردم و به خوبی کار کرد. در اینجا چیزی است که من به آن رسیدم که برای من کار کرد.

import * as Turbo from '@hotwired/turbo'

if (!window.scrollPositions) {
  window.scrollPositions = {};
}

function preserveScroll () {
  document.querySelectorAll("[data-preserve-scroll").forEach((element) => {
    scrollPositions[element.id] = element.scrollTop;
  })
}

function restoreScroll () {
  document.querySelectorAll("[data-preserve-scroll").forEach((element) => {
    element.scrollTop = scrollPositions[element.id];
  }) 
}

window.addEventListener("turbo:before-cache", preserveScroll)
window.addEventListener("turbo:load", restoreScroll)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2 نکته کلیدی برای توجه وجود دارد. هر عنصر باید یک شناسه منحصر به فرد داشته باشد و هر عنصر باید یک شناسه داشته باشد data-preserve-scroll بر روی آن. اینطوری:

<nav id="sidebar" data-preserve-scroll>
  <!-- stuff -->
</nav>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شکار مبارک!

ویرایش: یکی از نکات منفی این رویکرد این است که من متوجه سوسو زدن مختصری در Safari / Chrome شده‌ام. بدون سوسو زدن در FF. شاید یک Turbo Transition یا استفاده از data-turbo-permanent بتواند سوسو زدن را حذف کند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا