【问题标题】:How to remember scroll position and scroll back如何记住滚动位置并向后滚动
【发布时间】:2012-03-11 18:52:38
【问题描述】:

我正在使用 html2canvas 库,当我调用 html2canvas.Parse() 时,页面滚动到顶部。

我想如果我能记住调用 html2canvas.Parse() 之前的位置,那么我可以回到原来的滚动位置。

  1. 获取浏览器滚动的当前位置(特别是垂直)?
  2. 回滚到我之前存储的位置?

【问题讨论】:

标签: javascript scroll browser html2canvas


【解决方案1】:

这对我有用:

window.onbeforeunload = function () {
        var scrollPos;
        if (typeof window.pageYOffset != 'undefined') {
            scrollPos = window.pageYOffset;
        }
        else if (typeof document.compatMode != 'undefined' && document.compatMode != 'BackCompat') {
            scrollPos = document.documentElement.scrollTop;
        }
        else if (typeof document.body != 'undefined') {
            scrollPos = document.body.scrollTop;
        }
        document.cookie = "scrollTop=" + scrollPos + "URL=" + window.location.href;
    }

window.onload = function () {
    if (document.cookie.includes(window.location.href)) {
        if (document.cookie.match(/scrollTop=([^;]+)(;|$)/) != null) {
            var arr = document.cookie.match(/scrollTop=([^;]+)(;|$)/);
            document.documentElement.scrollTop = parseInt(arr[1]);
            document.body.scrollTop = parseInt(arr[1]);
        }
    }
}

我在其他地方找到了大部分代码,不幸的是我再也找不到源代码了。刚刚添加了一个检查URL是否相同,以便滚动位置只保存在同一页面,而不是其他页面。

【讨论】:

    【解决方案2】:

    我选择了现代 html5 浏览器来处理这个问题。它将最后滚动位置存储在客户端 Web 浏览器本身中,然后在重新加载页面时从浏览器读取设置回最后滚动位置。

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    
    <script type="text/javascript">
    $(document).ready(function () {
    
        if (localStorage.getItem("my_app_name_here-quote-scroll") != null) {
            $(window).scrollTop(localStorage.getItem("my_app_name_here-quote-scroll"));
        }
    
        $(window).on("scroll", function() {
            localStorage.setItem("my_app_name_here-quote-scroll", $(window).scrollTop());
        });
    
      });
    </script>
    

    【讨论】:

      【解决方案3】:

      要记住滚动使用此代码

      $(document).ready(function (e) {
          let UrlsObj = localStorage.getItem('rememberScroll');
          let ParseUrlsObj = JSON.parse(UrlsObj);
          let windowUrl = window.location.href;
      
          if (ParseUrlsObj == null) {
              return false;
          }
      
          ParseUrlsObj.forEach(function (el) {
              if (el.url === windowUrl) {
                  let getPos = el.scroll;
                  $(window).scrollTop(getPos);
              }
          });
      
      });
      
      function RememberScrollPage(scrollPos) {
      
          let UrlsObj = localStorage.getItem('rememberScroll');
          let urlsArr = JSON.parse(UrlsObj);
      
          if (urlsArr == null) {
              urlsArr = [];
          }
      
          if (urlsArr.length == 0) {
              urlsArr = [];
          }
      
          let urlWindow = window.location.href;
          let urlScroll = scrollPos;
          let urlObj = {url: urlWindow, scroll: scrollPos};
          let matchedUrl = false;
          let matchedIndex = 0;
      
          if (urlsArr.length != 0) {
              urlsArr.forEach(function (el, index) {
      
                  if (el.url === urlWindow) {
                      matchedUrl = true;
                      matchedIndex = index;
                  }
      
              });
      
              if (matchedUrl === true) {
                  urlsArr[matchedIndex].scroll = urlScroll;
              } else {
                  urlsArr.push(urlObj);
              }
      
      
          } else {
              urlsArr.push(urlObj);
          }
      
          localStorage.setItem('rememberScroll', JSON.stringify(urlsArr));
      
      }
      
      $(window).scroll(function (event) {
          let topScroll = $(window).scrollTop();
          console.log('Scrolling', topScroll);
          RememberScrollPage(topScroll);
      });
      

      【讨论】:

        【解决方案4】:
        1. 将滚动位置保存到变量
        2. 做点什么
        3. 向后滚动

        我在下面的示例中使用 jQuery 来简化事情,但您可以在 vanilla js 中轻松地做同样的事情。

        var scrollPos;
        
        $('.button').on('click', function() {
          
          // save scroll position to a variable
          scrollPos = $(window).scrollTop();
          
          // do something
          $('html, body').animate({
            scrollTop: $("#cats").offset().top
          }, 500);
          
          // scroll back
          setTimeout(
            function() {
              $('html, body').animate({
                scrollTop: scrollPos
              }, 500);
            }, 1000);
        });
        .button {
          position: fixed;
          font-size: 12px;
          margin: 10px;
        }
        
        #rainbow {
          height: 2000px;
          background: -webkit-linear-gradient(red, orange, yellow, green, cyan, blue, violet);
          background: -o-linear-gradient(red, orange, yellow, green, cyan, blue, violet);
          background: -moz-linear-gradient(red, orange, yellow, green, cyan, blue, violet);
          background: linear-gradient(red, orange, yellow, green, cyan, blue, violet);
        }
        
        #cats {
          width: 100%;
        }
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
        <input class="button" value="Scroll down a bit then click here for 1 second of cats!" type="button">
        <div id="rainbow"></div>
        <img id="cats" title="By Alvesgaspar [CC BY-SA 3.0 
         (https://creativecommons.org/licenses/by-sa/3.0
        )], via Wikimedia Commons" width="1024" alt="Cat poster 1" src="https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Cat_poster_1.jpg/1024px-Cat_poster_1.jpg">

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-30
          • 1970-01-01
          • 2012-09-26
          • 1970-01-01
          • 2013-09-21
          • 1970-01-01
          • 2020-09-24
          相关资源
          最近更新 更多