Advertisement
jcunews

remember-page-scroll-position.user.js

Feb 23rd, 2024
1,207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name         Remember page scroll position
  3. // @namespace    https://greasyfork.org/en/users/85671-jcunews
  4. // @version      1.0.1
  5. // @license      AGPL v3
  6. // @author       jcunews
  7. // @description  Context: https://www.reddit.com/r/userscripts/comments/1ayfnoh/add_scroll_position_to_url_is_this_possible/
  8. // @match        *://*/*
  9. // @include      *:*
  10. // @grant        GM_getValue
  11. // @grant        GM_setValue
  12. // ==/UserScript==
  13.  
  14. //Note: Scroll position applies to page only. Not elements within page. i.e. doesn't apply to scroll position of element content. Only the page.
  15.  
  16. (() => {
  17.   //=== CONFIG BEGIN
  18.   var delayBeforeApplyPagePosition = 500; //in milliseconds. 1 second = 1000ms. since last change to page height and position.
  19.   var delayBeforeSavePagePosition  = 500; //in milliseconds. 1 second = 1000ms. since last change to page position.
  20.   var maxDaysToKeepSavedPositions  = 30;  //since last update to saved page position.
  21.   //=== CONFIG END
  22.  
  23.   var pageHeight, posX, posY, timestamp, timer;
  24.   function savePos(recs, rec) {
  25.     recs = GM_getValue("records", {});
  26.     rec = recs[location.href] = recs[location.href] || {};
  27.     rec.x = scrollX;
  28.     rec.y = scrollY;
  29.     rec.ts = Date.now();
  30.     Object.keys(recs).forEach(k => {
  31.       if ((Date.now() - recs[k].ts) >= maxDaysToKeepSavedPositions*24*60*60*1000) delete recs[k]
  32.     });
  33.     GM_setValue("records", recs)
  34.   }
  35.   pageHeight = document.body.scrollHeight;
  36.   posX = scrollX;
  37.   posY = scrollY;
  38.   timestamp = Date.now();
  39.   (function checkPage(rec) {
  40.     if ((document.body.scrollHeight !== pageHeight) || (document.body.scrollLeft !== scrollX) || (document.body.scrollTop !== scrollY)) {
  41.       pageHeight = document.body.scrollHeight;
  42.       posX = scrollX;
  43.       posY = scrollY;
  44.       timestamp = Date.now()
  45.     } else if ((Date.now() - timestamp) >= delayBeforeApplyPagePosition) {
  46.       addEventListener("beforeunload", savePos);
  47.       addEventListener("blur", savePos);
  48.       addEventListener("focus", savePos);
  49.       addEventListener("scroll", () => {
  50.         clearTimeout(timer);
  51.         timer = setTimeout(savePos, delayBeforeSavePagePosition)
  52.       });
  53.       if (rec = GM_getValue("records", {})[location.href]) scrollTo(rec.x, rec.y);
  54.       return
  55.     }
  56.     setTimeout(checkPage, 100)
  57.   })()
  58. })()
  59.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement