【问题标题】:Remove anchor from url and history after jquery smooth scroll [duplicate]jquery平滑滚动后从url和历史记录中删除锚点[重复]
【发布时间】:2013-07-15 19:51:14
【问题描述】:

我有一个使用 jquery 1.10 和 the code listed below 平滑滚动锚链接的页面。平滑滚动效果很好。单击“返回顶部”链接后,一个项目被添加到用户的历史记录中并在 url 中可见(如domain.com/page#header),这是预期的。

但是,因为这会弄乱 url 并破坏后退按钮的功能,所以我试图从 url 和浏览器历史记录中删除锚点。我尝试了几种删除锚链接或历史记录项的方法,但它们都与平滑滚动的代码发生冲突。

所以我的问题是,在平滑滚动完成后,有谁知道如何从 url 中删除此锚点并删除最后一个历史记录项?

一个例子:http://jsfiddle.net/CQywc/5/

编辑:我没有删除这个问题,因为我很难弄清楚我需要做什么,即使我看到了其他问题的答案(它们解决了一个稍微不同的问题,并且没有明确解决添加的历史记录项)。所以我会把这个留给有同样问题的人。


平滑滚动代码:

$(document).ready(function() {
  function filterPath(string) {
  return string
 .replace(/^\//,'')
 .replace(/(index|default).[a-zA-Z]{3,4}$/,'')
 .replace(/\/$/,'');
  }
  var locationPath = filterPath(location.pathname);
  var scrollElem = scrollableElement('html', 'body');
  $('a[href*=#]').each(function() {
 var thisPath = filterPath(this.pathname) || locationPath;
 if (  locationPath == thisPath
 && (location.hostname == this.hostname || !this.hostname)
 && this.hash.replace(/#/,'') ) {
   var $target = $(this.hash), target = this.hash;
   if (target) {
  var targetOffset = $target.offset().top;
  $(this).click(function(event) {
    event.preventDefault();
    $(scrollElem).animate({scrollTop: targetOffset}, 400, function() {
   location.hash = target;
    });
  });
   }
 }
  });
  // use the first element that is "scrollable"
  function scrollableElement(els) {
 for (var i = 0, argLength = arguments.length; i <argLength; i++) {
   var el = arguments[i],
    $scrollElement = $(el);
   if ($scrollElement.scrollTop()> 0) {
  return el;
   } else {
  $scrollElement.scrollTop(1);
  var isScrollable = $scrollElement.scrollTop()> 0;
  $scrollElement.scrollTop(0);
  if (isScrollable) {
    return el;
  }
   }
 }
 return [];
  }
});

【问题讨论】:

    标签: jquery html url anchor browser-history


    【解决方案1】:

    我通过注释以下代码解决了这个问题:

    location.hash = target; // comment by putting two forward slashes in front of this line of code
    

    未注释时显式将哈希添加到 url。感谢 Jeff B,this question。它还解决了添加的历史记录项,因此后退按钮再次按预期工作。

    【讨论】:

      【解决方案2】:

      您只需在脚本末尾添加以下代码,它将清除所有查询字符串或其他任何内容。

      history.replaceState({}, '', '/'); 
      

      【讨论】:

      • 感谢您的回答!我已经尝试过了,但它也会从 url 中清除我的页面名称,而不仅仅是锚点。所以 url 从domain.com/page#top 被清除为domain.com。但我想要完成的是把它送到domain.com/page。任何想法如何做到这一点?
      • 简单地用这一行替换 history.replaceState({}, '', '/page');
      • 是的,但这需要将该页面动态更改为当前页面的名称(我有不止一个页面在使用此脚本)。或者我必须为每个页面设置不同版本的脚本.. 仅从 url 中清除锚点而不是将 url 完全清除到根地址不是更直接吗?
      【解决方案3】:

      不用指向一个div,你可以通过这段代码实现同样的目的......

      application.js

      function show_top(){
          if( $(document).scrollTop !=0 ){
              $ ('html, body').animate ( { scrollTop:0 } ,1000 );
          }
      }
      

      在视图中

      <a href="javascript:" onclick="show_top()">GO TO TOP</a>
      

      【讨论】:

      • 我想尝试使用锚点,因为对于那些没有启用 javascript 的人来说,它会更优雅地降级。不过谢谢你的建议!
      猜你喜欢
      • 2021-05-24
      • 2013-11-16
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多