【问题标题】:How to maintain page scroll position after a jquery event is carried out?执行 jquery 事件后如何保持页面滚动位置?
【发布时间】:2012-06-05 21:03:11
【问题描述】:

我搜索了高低的答案并找到了类似的问题示例,但答案不适用于我的场景。现实情况是我对此并不陌生,因此我没有能力根据我的问题调整我找到的答案。

问题:

我有一个 Div,当单击缩略图时,Div 图像通过 JavaScript/jQuery 脚本替换为另一个图像(我不确定是否有人可以澄清)。这可以正常工作,但问题是页面滚动回顶部,然后用户必须向下滚动才能看到替换后的图像。

我在网上查看并发现 return false: 在 JavaScript 中可能会有所帮助,但是我查看并 return false 已经存在。

我使用的另一个选项是基于 JavaScript cookie 的解决方案,其中发送 cookie,并通过读取 cookie 来保持浏览器滚动位置,但是我似乎无法让该解决方案工作,我认为问题可能是因为我在本地托管,但我可能错了......

第三个是使用 PHP 脚本,但我还没有找到关于这种方法的明确答案,这也意味着我将不得不学习 PHP(我相信无论如何我都必须及时学习)。

这里是 JavaScript:

<script type="text/javascript">

 $(document).ready(function() {
  $('.galleryicon').live("click", function() {

    $('#mainImage').hide();
    $('#cakebox').css('background-image', "url('ajax-loader.gif')");
    var i = $('<img />').attr('src',this.href).load(function() {
        $('#mainImage').attr('src', i.attr('src'));
        $('#cakebox').css('background-image', 'none');
        $('#mainImage').fadeIn();
    });
    return false; 
   });
 });

</script>

这里是html:

<div class="cakecont">

  <div id="cakebox">

 <img src="../images/cakes/babycake1.png" alt="Main Image" id="mainImage"/>

     <div class="pageinfo2">
     <h3>Cake Type 1</h3>
     <h6>£2.00</h6>
     </div>
     <div class="infobox">
     <h6> Description </h6>
     </div> 

      <div class="gallerybox">
      <a href="../images/cakes/babycaketop.png" class="galleryicon">
      <img src="../images/thumbs/babycaketopsml.png" alt="Thumbnail 2"/></a>

      <a href="../images/cakes/babycake1.png" class="galleryicon">
      <img src="../images/thumbs/babycakesml.png" alt="Image 1"/></a>
   </div>
  </div>
</div>

这里是工作演示的链接http://micahcarrick.com/code/jquery-image-swap/index.html

我已尝试自行解决此问题。这是迄今为止我不得不问的关于我的网站建设的第一个问题,我对过去问题的所有学习和补救措施都由谷歌提供,这个问题已经避开了我的搜索引擎技能。

下面我已经添加了页面的所有 html,以防可能有其他脚本覆盖“新”修改后的 JavaScript -

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org     /TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml"><head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Cupcakes &amp; Cakes for Birthday/Wedding Gift in Bournemouth Dorset - SweetVision</title>
   <meta name="keywords" content="cupcakes, cake, gift, wedding, birthday, Bournemouth, Dorset" />
 <meta name="description" content="For the finest Cupcakes and Cakes in Bournemouth Dorset look no further, Sweetvision specialise in baked goods for Weddings, Birthdays, Baby Showers, Easter, Halloween, Christmas" />
 <meta name="robots" content="ALL" />
 <meta http-equiv= "Content-Language" content="en" />
 <meta name="Publisher" content="Sweet Vision" />
 <meta name="Copyright" content="Copyright 2012, Sweet Vision, All rights reserved." />
 <meta name="Author" content="Mark Webb for Sweet Vision - www.sweetvision.co.uk" />

  <link href="../images/homepage/favicon.ico" type="image/vnd.microsoft.icon" rel="shortcut icon" />

  <link href="../root/css/sweetvision.css" rel="stylesheet" type="text/css" />

  <script src="../js/jquery-1.4.2.min.js" type="text/javascript"></script>

  <script type="text/javascript">

 $(document).ready(function() {   
$('.galleryicon').live("click", function(e) {  // the (e) represent the event
$('#mainImage').hide();     
$('#cakebox').css('background-image', "url('ajax-loader.gif')");     
var i = $('<img />').attr('src',this.href).load(function() {         
  $('#mainImage').attr('src', i.attr('src'));         
  $('#cakebox').css('background-image', 'none');         
  $('#mainImage').fadeIn();     
 });
 e.preventDefault(); //Prevent default click action which is causing the 
 return false;       //page to scroll back to the top
 });  
});


</script>

<script src="../js/s3Slider.js" type="text/javascript"></script> 

 <script type="text/javascript">

 $(document).ready(function() {
 $('#s3slider').s3Slider({
  timeOut: 4000
  });
}); 
  </script>

  <script src="../js/SpryMenuBar.js" type="text/javascript"></script>
  <link href="../root/css/SpryMenuBarHorizontal.css" rel="stylesheet" type="text/css" />

  </head> 


 <body>



  <div class="container">


 <div class="sprybox">
   <ul id="check_menu" class="MenuBarHorizontal">
    <li><a href="../root/index.html">Home</a></li>
    <li><a href="../root/aboutus.html" class="MenuBarItemSubmenu">About Us</a>
      <ul>
        <li><a href="../root/contactus.html">Contact</a></li>
        <li><a href="../root/news.html">News</a></li>
        <li><a href="../root/events.html">Events</a></li>
      </ul>
    </li>
       <li><a href="../root/ourmenu.html">Our Menu</a></li>
         <li><a href="gallery.html">Gallery</a></li>
          </ul>
        <div class="mainmenu">
           <a href="../root/mainmenu.html">
           <img src="../images/buttons/mainmenu.png" />
           </a>
       </div>
        <div class="backbutton">
        <a href="javascript:history.go(-1)"> 
        <img src="../images/buttons/Backbutton.png" /></a>
      </div>

    </div>  <!-- end.header --><!--end of sprybox -->

  <!--end div element -->


 <!-- thumbnails are links to the full size image -->

  <div class="cakecont">

 <div id="cakebox">

  <img src="../images/cakes/babycake1.png" alt="Main Image" id="mainImage"/>

     <div class="pageinfo2">
     <h3>Cake Type 1</h3>
     <h6>£2.00</h6>
     </div>
     <div class="infobox">
     <h6> Description </h6>
     </div> 

 <div class="gallerybox">
      <a href="../images/cakes/babycaketop.png" class="galleryicon">
      <img src="../images/thumbs/babycaketopsml.png" alt="Thumbnail 2"/></a>

      <a href="../images/cakes/babycake1.png" class="galleryicon">
      <img src="../images/thumbs/babycakesml.png" alt="Image 1"/></a>
  </div>
  </div>
</div>



 <div class="footer">
  <p>Copyright &copy; 2012 by Mark Webb. All rights reserved.</p>
 </div> <!-- end .footer -->

</div> <!-- end .container -->


 <script type="text/javascript">
 var MenuBar1 = new Spry.Widget.MenuBar("check_menu",{imgDown:"SpryAssets/SpryMenuBarDownHover.gif",   imgRight:"SpryAssets/SpryMenuBarRightHover.gif"});
  </script>

 <script type="text/javascript">

  var _gaq = _gaq || [];
 _gaq.push(['_setAccount', 'UA-29457683-1']);
  _gaq.push(['_trackPageview']);

   (function() {
  var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
  ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') +    '.google-analytics.com/ga.js';
  var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

 </script>


 </body>
</html>

【问题讨论】:

  • 当我访问该页面时,我看不到任何滚动条。整个页面适合屏幕。您使用的是较小的分辨率吗?
  • 是的,我在笔记本电脑上,所以我得到了滚动效果,谢谢。

标签: javascript jquery html


【解决方案1】:

你可以保存当前的滚动量,以后再设置:

var tempScrollTop = $(window).scrollTop();

..//Your code

$(window).scrollTop(tempScrollTop);

【讨论】:

  • 感谢您的回答,但我不确定我在哪里实现您的代码,我对 Javascript 知之甚少。
  • @user1428659:对于每次单击,您都希望在执行任何操作之前保存滚动位置,然后在所有操作完成后恢复它。因此,您可以将第一行放在 click 函数的开头,最后一行放在它的末尾(在 return 语句之前)。
  • @user1428659:嗯,我刚刚再次查看了您的代码,这可能无法正常工作,因为它看起来可能是异步的(在恢复滚动之前没有调用fadeIn)。因此,如果这对您不起作用,请将第二行放在 fadeIn() 之后。另一方面,如果您知道图像的高度,则可以将图像标签包装在该高度的空白 div 中,该高度始终显示以防止其开始滚动。
【解决方案2】:

对于所有从谷歌来到这里并使用锚元素触发事件的人,请确保同样取消点击:

<a  
href='javascript:void(0)'  
onclick='javascript:whatever causing the page to scroll to the top'  
></a>

【讨论】:

  • 非常感谢,我正试图阻止 $('form').submit(function{}); 上的滚动与 e.preventDefault();如果我把 $(window).scrollTop(tempScrollTop);在返回之前,或者即使我返回了那个,它仍然回到了顶部。这对我有用。
  • @Akeel 我认为通过使用类似 href="#" 的方式将默认操作应用于浏览器,使其滚动到顶部(重定向到 http..../#. 通过使用什么Nasser Al-Wohaibi 建议或类似的东西 -Put return false; 在您的点击处理程序的底部,并且不会遵循 href。-在您的处理程序中的事件上调用 preventDefault: function( e ) { e.preventDefault(); / /你的事件处理代码}你强制浏览器不执行默认操作
  • 优秀。单击清晰的锚标记时,我遇到了 SignaturePad 画布控件将滚动位置设置为顶部的问题。这完美地解决了我的问题!
【解决方案3】:

尝试下面的代码来防止默认行为回滚到页面顶部

$(document).ready(function() {   
  $('.galleryicon').live("click", function(e) {  // the (e) represent the event
    $('#mainImage').hide();     
    $('#cakebox').css('background-image', "url('ajax-loader.gif')");     
    var i = $('<img />').attr('src',this.href).load(function() {         
      $('#mainImage').attr('src', i.attr('src'));         
      $('#cakebox').css('background-image', 'none');         
      $('#mainImage').fadeIn();     
    });
  e.preventDefault(); //Prevent default click action which is causing the 
  return false;       //page to scroll back to the top
  });  
});

有关 event.preventDefault() 的更多信息,请查看官方文档中的here

【讨论】:

  • 非常感谢您的回答我已经实现了代码但它仍然跳到页面顶部我想知道是否有另一个脚本覆盖它。
  • 我刚刚制作了一个测试页面,只要滚动条不在页面底部,您的解决方案似乎就可以工作(即,由于没有内容,您无法进一步滚动)
  • Opps 命中返回 - 但是如果滚动条位于底部,页面会向上跳 1 厘米。现在我刚刚尝试在页面上添加一个 400 像素高的页脚,一旦单击缩略图,页面就会跳升 1 厘米,但只要不滚动并单击另一个拇指,页面就会保持静态。但是,如果您再次稍微滚动,然后点击拇指,页面会向上或向下跳跃,具体取决于您是向上还是向下滚动 - 奇怪。感谢您的帮助
  • 我至少暂时解决了这个问题。插入 e.preventDefault() 后,我注意到页面自动移动到缩略图 div 的底部边缘。为了解决这个问题,我将包含缩略图的 div 的高度扩展到了一些荒谬的东西(400 像素),现在当每个拇指被点击时页面不会滚动为什么会这样?
  • Argh - 现在它显示一个虚线框,在 IE 中向下延伸 400px 的页面,所以我什至无法躲避它......
【解决方案4】:

您要做的是阻止点击事件的默认操作。为此,您需要像这样修改脚本:

$(document).ready(function() {
  $('.galleryicon').live("click", function(e) {

    $('#mainImage').hide();
    $('#cakebox').css('background-image', "url('ajax-loader.gif')");
    var i = $('<img />').attr('src',this.href).load(function() {
        $('#mainImage').attr('src', i.attr('src'));
        $('#cakebox').css('background-image', 'none');
        $('#mainImage').fadeIn();
    });
    return false; 
    e.preventDefault();
   });
 });

因此,您在$('.galleryicon').live("click", function(e) { 行中添加一个表示事件的“e”,并且您正在添加e.preventDefault(); 行中

【讨论】:

  • 感谢您的回答,但如上所述,代码仍会导致页面跳到顶部 - 我想知道是否有其他东西覆盖了脚本。使用相同代码的演示站点具有相同的效果。如果您向下滚动页面,然后单击缩略图,页面将返回顶部...不过谢谢。
  • 我至少暂时解决了这个问题。插入 e.preventDefault() 后,我注意到页面自动移动到缩略图 div 的底部边缘。为了解决这个问题,我将包含缩略图的 div 的高度扩展到了一些荒谬的东西(400px),现在当每个拇指被点击时页面不会滚动,为什么会这样?
【解决方案5】:

我在重新加载 div 内容后让 scrollTop 工作时遇到了类似的问题。每次运行以下过程时,内容都会滚动到顶部。我发现在设置新的滚动顶部之前有一点延迟解决了这个问题。

这是从我修改此过程的 wdCalendar 中截取的:

 function BuildDaysAndWeekView(startday, l, events, config)
   ....
        var scrollpos = $("#dvtec").scrollTop();
        gridcontainer.html(html.join(""));
        setTimeout(function() {
            $("#dvtec").scrollTop(scrollpos);
        }, 25);
   ....

没有延迟,它根本不起作用。

【讨论】:

    【解决方案6】:

    需要注意的是,在设置滚动位置时,请确保在正确的范围内进行。例如,如果您在多个函数中使用滚动位置,您可能希望在这些函数之外设置它。

    $(document).ready(function() {
        var tempScrollTop = $(window).scrollTop();
        function example() {
            console.log(tempScrollTop);
        };
    
    });
    

    【讨论】:

      【解决方案7】:
      $('html,body').animate({
        scrollTop: $('#answer-<%= @answer.id %>').offset().top - 50
      }, 700);
      

      【讨论】:

      • 欢迎来到 Stack Overflow!虽然此代码 sn-p 可能是解决方案,但including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      猜你喜欢
      • 2011-10-18
      • 1970-01-01
      • 2011-04-26
      • 2012-04-25
      • 2013-07-12
      • 2017-08-02
      • 2020-02-29
      • 2015-02-24
      • 1970-01-01
      相关资源
      最近更新 更多