【问题标题】:Prevent scrolling from anchor tags防止从锚标签滚动
【发布时间】:2012-02-05 03:33:38
【问题描述】:

我正在使用 jQuery 进行简单的导航,通过在页面上显示或隐藏内容窗格来加载内容窗格。我正在使用锚标签来确定要显示的窗格。我还使用“就绪”函数在页面加载时显示#hash 元素。非常基本:

$(document).ready(function() {
  $('#video_form_content > div').hide();
  var showTab = window.location.hash || "#basic-info";
  $(showTab).show();
}

$('#video_form_tabs li').on('click', function() {
    $('#video_form_content > div').hide();
    var target = $(this).children('a').attr('href');
    $(target).show();
})

但是,当点击元素时,页面会跳转到目标div 的顶部。我不希望这种跳转,但我确实希望保留锚标记的默认功能,因为我希望将哈希添加到 URL,以便刷新会重新打开同一个选项卡。

这是我尝试过的

  • $(window).scrollTop(0) 添加到点击事件。我认为可能,但此事件在锚元素的实际导航之前触发,因此它会立即撤消。
  • $(window).scrollTop(0) 添加到$(document).ready() 但是,单击同一页面的锚点时不会触发此侦听器。
  • window.location.hash = targetwindow.location.href = target 添加到点击事件。但是,这仍然会导致页面重新提交,并且仍然“跳转”。
  • return false 添加到函数中。这可以防止将哈希添加到 URL,这是非常受欢迎的。

这真的让我很困惑,任何帮助将不胜感激。

【问题讨论】:

    标签: jquery tabs navigation anchor


    【解决方案1】:

    如果你想在url中保留hash,你必须手动添加它

    e.preventDefault(); // stop browser from following href
    var url = $(this).prop('href'); // get href
    var hash = url.split('#'); // get the hash-part
    if(hash.length > 1) location.hash = hash[1]; // rewrite the url
    

    我只在 Chrome 中对此进行了测试,它在那里运行良好。

    【讨论】:

      【解决方案2】:

      我的方法是向可点击元素添加一个通用类,然后执行一个超时为 0 的 setTimeout。在我的例子中,我将“top”类添加到我的可点击元素中。

      $(".top").click(function(){
          setTimeout(function(){
              window.scrollTo(0, 0);
          }, 0);
      })
      

      您可以随意设置 x 和 y 坐标:

      scrollTo(X, Y);
      

      快速简单!

      这样做可以保持当前滚动位置:

      $(".top").click(function(){
          var position = $(document).scrollTop();
          setTimeout(function(){
              window.scrollTo(0, position);
          }, 0);
      })
      

      【讨论】:

        【解决方案3】:

        #basic-info-TAB 之类的东西识别你的目标divs,然后将"-TAB" 添加到target 变量中。

        【讨论】:

        • 很好的建议,但是如果用户已经滚动了一些页面,这仍然会导致跳转到页面顶部。 +1,因为我还没有考虑过尝试
        • 为什么会这样? “-TAB”对浏览器有什么作用?
        【解决方案4】:

        您应该将事件附加到锚点并取消默认事件处理程序:

        $(document).ready(function() {
          $('#video_form_content > div').hide();
          var showTab = window.location.hash || "#basic-info";
          $(showTab).show();
        }
        
        $('#video_form_tabs li a').on('click', function(e) {
            e.preventDefault(); // stop browser from following href
            $('#video_form_content > div').hide();
            var target = $(this).attr('href');
            $(target).show();
        })
        

        【讨论】:

        • 还有 onclick="return false;"会阻止默认处理程序。
        • 除非这不会将哈希添加到 URL 的末尾。而且我已经尝试过返回 false,但结果是否定的。
        • 为了防止滚动,您必须将其设置为不存在的 id 并稍后重建它,或者使用 HTML5 History API。看看stackoverflow.com/questions/3090478/jquery-hash-change-event
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-05
        • 1970-01-01
        • 2021-11-13
        • 1970-01-01
        • 2012-06-17
        • 1970-01-01
        • 2017-08-12
        相关资源
        最近更新 更多