【问题标题】:Javascript retain the horizontal scroll bar position on reloadJavascript在重新加载时保留水平滚动条位置
【发布时间】:2018-08-07 17:09:31
【问题描述】:

我的网页上有一个水平缩略图滚动条,我正在使用here 提供的代码滚动到缩略图库中的特定图像。但是,当我使用 F5 重新加载页面时,图库会返回到第一个图像位置。这成为一个问题,因为我的缩略图库有大约 7500 张图片。

我修改了这段代码,将 addEventListener 添加到窗口 onload 中,并将最后点击的缩略图保留为 localStorage 中的索引值。在窗口加载时,我使用索引将滚动条推到最后点击的图像位置。但它不起作用,我也没有收到任何错误。修改后的代码如下:

<!DOCTYPE html>
<html>
<head>
  <style>
  li{display: table-cell; padding:20px;}
  ul{display: table-row; }
  .cont{overflow: auto;}
  li.active{border: 1px solid blue;}
  </style>
</head>
<body>
   <div class="book-list-headbox">
       <div class="page-number-box">
           <label for="" id="total-page" value="" class="mb-0"></label>
           <span class="separator">of</span>
           <input type="text" id="current-page" value="1">
       </div>
   </div>
   <div class="cont">
  <ul class="book-list" id="book-list">
        <li class="book active"><img src="http://via.placeholder.com/300x300/?text=1" alt="Book Page"></li>
        <li class="book"><img src="http://via.placeholder.com/300x300/?text=2" alt="Book Page"></li>
        <li class="book"><img src="http://via.placeholder.com/300x300/?text=3" alt="Book Page"></li>
        <li class="book"><img src="http://via.placeholder.com/300x300/?text=4" alt="Book Page"></li>
        <li class="book"><img src="http://via.placeholder.com/300x300/?text=5" alt="Book Page"></li>
        <li class="book"><img src="http://via.placeholder.com/300x300/?text=6" alt="Book Page"></li>
        <li class="book"><img src="http://via.placeholder.com/300x300/?text=7" alt="Book Page"></li>
        <li class="book"><img src="http://via.placeholder.com/300x300/?text=8" alt="Book Page"></li>
        <li class="book"><img src="http://via.placeholder.com/300x300/?text=9" alt="Book Page"></li>
        <li class="book"><img src="http://via.placeholder.com/300x300/?text=11" alt="Book Page"></li>
        <li class="book"><img src="http://via.placeholder.com/300x300/?text=12" alt="Book Page"></li>
        <li class="book"><img src="http://via.placeholder.com/300x300/?text=13" alt="Book Page"></li>
        <li class="book"><img src="http://via.placeholder.com/300x300/?text=14" alt="Book Page"></li>
        <li class="book"><img src="http://via.placeholder.com/300x300/?text=15" alt="Book Page"></li>
        <li class="book"><img src="http://via.placeholder.com/300x300/?text=16" alt="Book Page"></li>
        <li class="book"><img src="http://via.placeholder.com/300x300/?text=17" alt="Book Page"></li>
        <li class="book"><img src="http://via.placeholder.com/300x300/?text=18" alt="Book Page"></li>
        <li class="book"><img src="http://via.placeholder.com/300x300/?text=19" alt="Book Page"></li>
        <li class="book"><img src="http://via.placeholder.com/300x300/?text=20" alt="Book Page"></li>
  </ul>
</div>

  <div>another content</div>
  <script src="https://code.jquery.com/jquery-3.1.0.js"></script>
  <script>
  $(function(){
    $('#current-page').change(function() {
      var i = $(this).val() -1;
      activeBook(i);
      localStorage.setItem('clicki', i);

    });
    $('.book-list').on('click', '.book', function(){
      activeBook($(this).index());
    });

    function activeBook(i){
      $('.book').removeClass('active');
      var active = $('.book').eq(i).addClass('active');
      var left = active.position().left;
      var currScroll= $(".cont").scrollLeft(); 
      var contWidth = $('.cont').width()/2; 
      var activeOuterWidth = active.outerWidth()/2; 
      left= left + currScroll - contWidth + activeOuterWidth;


      $('.cont').animate( { 
        scrollLeft: left
      },'slow');
    }
  });

  window.addEventListener('load', function() {
    $(function(){
    $('#current-page').change(function() { //I tried changing this to onload function
      var clicki = localStorage.getItem('clicki');
      alert(clicki); //This alert also doesn't work.
      var i = clicki;
      activeBook(i);
    });
    $('.book-list').on('click', '.book', function(){
      activeBook($(this).index());
    });

    function activeBook(i){
      $('.book').removeClass('active');
      var active = $('.book').eq(i).addClass('active');
      var left = active.position().left;
      var currScroll= $(".cont").scrollLeft(); 
      var contWidth = $('.cont').width()/2; 
      var activeOuterWidth = active.outerWidth()/2; 
      left= left + currScroll - contWidth + activeOuterWidth;


      $('.cont').animate( { 
        scrollLeft: left
      },'slow');
    }
  });
  })

  </script>
</body>
</html>

【问题讨论】:

    标签: javascript jquery html


    【解决方案1】:

    你可以这样做:

    1. 在您的 onLoad 侦听器上设置一个变量,然后输入 0(第一张照片)或您的 localStorage.getItem('clicki') 如果 > 0(或 true)

    2. 然后使用activeBook(clicki);

    试试看:

    <!DOCTYPE html>
    <html>
    <head>
      <style>
      li{display: table-cell; padding:20px;}
      ul{display: table-row; }
      .cont{overflow: auto;}
      li.active{border: 1px solid blue;}
      </style>
    </head>
    <body>
       <div class="book-list-headbox">
           <div class="page-number-box">
               <label for="" id="total-page" value="" class="mb-0"></label>
               <span class="separator">of</span>
               <input type="text" id="current-page" value="1">
           </div>
       </div>
       <div class="cont">
      <ul class="book-list" id="book-list">
            <li class="book active"><img src="http://via.placeholder.com/300x300/?text=1" alt="Book Page"></li>
            <li class="book"><img src="http://via.placeholder.com/300x300/?text=2" alt="Book Page"></li>
            <li class="book"><img src="http://via.placeholder.com/300x300/?text=3" alt="Book Page"></li>
            <li class="book"><img src="http://via.placeholder.com/300x300/?text=4" alt="Book Page"></li>
            <li class="book"><img src="http://via.placeholder.com/300x300/?text=5" alt="Book Page"></li>
            <li class="book"><img src="http://via.placeholder.com/300x300/?text=6" alt="Book Page"></li>
            <li class="book"><img src="http://via.placeholder.com/300x300/?text=7" alt="Book Page"></li>
            <li class="book"><img src="http://via.placeholder.com/300x300/?text=8" alt="Book Page"></li>
            <li class="book"><img src="http://via.placeholder.com/300x300/?text=9" alt="Book Page"></li>
            <li class="book"><img src="http://via.placeholder.com/300x300/?text=11" alt="Book Page"></li>
            <li class="book"><img src="http://via.placeholder.com/300x300/?text=12" alt="Book Page"></li>
            <li class="book"><img src="http://via.placeholder.com/300x300/?text=13" alt="Book Page"></li>
            <li class="book"><img src="http://via.placeholder.com/300x300/?text=14" alt="Book Page"></li>
            <li class="book"><img src="http://via.placeholder.com/300x300/?text=15" alt="Book Page"></li>
            <li class="book"><img src="http://via.placeholder.com/300x300/?text=16" alt="Book Page"></li>
            <li class="book"><img src="http://via.placeholder.com/300x300/?text=17" alt="Book Page"></li>
            <li class="book"><img src="http://via.placeholder.com/300x300/?text=18" alt="Book Page"></li>
            <li class="book"><img src="http://via.placeholder.com/300x300/?text=19" alt="Book Page"></li>
            <li class="book"><img src="http://via.placeholder.com/300x300/?text=20" alt="Book Page"></li>
      </ul>
    </div>
    
      <div>another content</div>
      <script src="https://code.jquery.com/jquery-3.1.0.js"></script>
      <script>
    
    
      $(function(){
    
        $('#current-page').change(function() {
          setStorage($(this).val() -1)
        });
    
    
        $('.book-list').on('click', '.book', function(){
          setStorage($(this).index())
        });
    
      });
    
      window.addEventListener('load', function() {
          var clicki = (localStorage.getItem('clicki')) ? (localStorage.getItem('clicki')) : 0 ;
          // alert(clicki);
          activeBook(clicki);
      });
    
    
      function setStorage(myNum){
        localStorage.setItem('clicki', myNum);
        activeBook(myNum);
      }
    
      function activeBook(i){
        $('.book').removeClass('active');
        var active = $('.book').eq(i).addClass('active');
        var left = active.position().left;
        var currScroll= $(".cont").scrollLeft(); 
        var contWidth = $('.cont').width()/2; 
        var activeOuterWidth = active.outerWidth()/2; 
        left= left + currScroll - contWidth + activeOuterWidth;
    
    
        $('.cont').animate( { 
          scrollLeft: left
        },'slow');
      }
    
      </script>
    </body>
    </html>
    

    PS:我创建了一个函数来设置 localStorage,当你点击 img 时。如果它对您不重要,请将其删除。

    【讨论】:

      【解决方案2】:

      以下代码将满足您的需求。

      <!DOCTYPE html>
      <html>
      <head>
        <style>
        li{display: table-cell; padding:20px;}
        ul{display: table-row; }
        .cont{overflow: auto;}
        li.active{border: 1px solid blue;}
        </style>
      </head>
      <body>
         <div class="book-list-headbox">
             <div class="page-number-box">
                 <label for="" id="total-page" value="" class="mb-0"></label>
                 <span class="separator">of</span>
                 <input type="text" id="current-page" value="1">
             </div>
         </div>
         <div class="cont">
        <ul class="book-list" id="book-list">
              <li class="book active"><img src="http://via.placeholder.com/300x300/?text=1" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=2" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=3" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=4" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=5" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=6" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=7" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=8" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=9" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=10" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=11" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=12" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=13" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=14" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=15" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=16" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=17" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=18" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=19" alt="Book Page"></li>
              <li class="book"><img src="http://via.placeholder.com/300x300/?text=20" alt="Book Page"></li>
        </ul>
      </div>
      
        <div>another content</div>
        <script src="https://code.jquery.com/jquery-3.1.0.js"></script>
        <script>
        $(function(){
          $('#current-page').change(function() {
            var i = $(this).val() -1;
            activeBook(i);
            localStorage.setItem('clicki', i);
      
          });
          $('.book-list').on('click', '.book', function(){
            activeBook($(this).index());
          });
      
          function activeBook(i){
            $('.book').removeClass('active');
            var active = $('.book').eq(i).addClass('active');
            var left = active.position().left;
            var currScroll= $(".cont").scrollLeft(); 
            var contWidth = $('.cont').width()/2; 
            var activeOuterWidth = active.outerWidth()/2; 
            left= left + currScroll - contWidth + activeOuterWidth;
      
      
            $('.cont').animate( { 
              scrollLeft: left
            },'slow');
          }
        });
      
        window.addEventListener('load', function() {
            var clicki = localStorage.getItem('clicki');
            var i = clicki;
            activeBook(i);
      
          $('.book-list').on('click', '.book', function(){
            activeBook($(this).index());
          });
      
          function activeBook(i){
              $('#current-page').val(i);
            $('.book').removeClass('active');
            var active = $('.book').eq(i).addClass('active');
            var left = active.position().left;
            var currScroll= $(".cont").scrollLeft(); 
            var contWidth = $('.cont').width()/2; 
            var activeOuterWidth = active.outerWidth()/2; 
            left= left + currScroll - contWidth + activeOuterWidth;
      
      
            $('.cont').animate( { 
              scrollLeft: left
            },'slow');
          }
        });
      
        </script>
      </body>
      </html>
      

      我刚刚将您的代码更改为window load。 所以window load成功时会自动触发。 尝试将其保存为一个单独的 html 文件并在 apache server 中运行,您将得到您所期望的。

      【讨论】:

      • @Apricot 如果您满意,请将其标记为答案。
      猜你喜欢
      • 1970-01-01
      • 2014-12-05
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 2012-10-16
      • 2015-02-20
      • 2016-10-19
      • 1970-01-01
      相关资源
      最近更新 更多