当前位置: 首页 > 面试题库 >

如何在AngularJS中处理锚点哈希链接

锺离声
2023-03-14
问题内容

你们中 有谁 知道如何在 AngularJS中 很好地处理锚点哈希链接吗?

我为简单的常见问题解答页面添加了以下标记

<a href="#faq-1">Question 1</a>
<a href="#faq-2">Question 2</a>
<a href="#faq-3">Question 3</a>

<h3 id="faq-1">Question 1</h3>
<h3 id="faq-2">Question 2</h3>
<h3 id="fa1-3">Question 3</h3>

单击上面的任何链接时,AngularJS会拦截并将我路由到一个完全不同的页面(在我的情况下是404页,因为没有路由与这些链接匹配。)

我的第一个想法是创建一个匹配“ / faq /:chapter
的路由,并在相应的控制器中检查$routeParams.chapter匹配的元素之后,然后使用jQuery向下滚动到它。

但是随后AngularJS再次对我大喊大叫,无论如何仍只是滚动到页面顶部。

那么,这里有人在过去做过类似的事情并且知道解决方案吗?

编辑:切换到html5Mode应该可以解决我的问题,但是无论如何我们都必须支持IE8 +,所以我担心这不是一个可以接受的解决方案:/


问题答案:

您正在寻找$anchorScroll()

这是(糟糕的)文档。

这是来源。

基本上,您只需将其注入并在控制器中调用它,它就会将您滚动到ID为的任何元素 $location.hash()

app.controller('TestCtrl', function($scope, $location, $anchorScroll) {
   $scope.scrollTo = function(id) {
      $location.hash(id);
      $anchorScroll();
   }
});

<a ng-click="scrollTo('foo')">Foo</a>

<div id="foo">Here you are</div>

这是一个演示的朋克

编辑:与路由一起使用

像往常一样设置角度布线,然后只需添加以下代码。

app.run(function($rootScope, $location, $anchorScroll, $routeParams) {
  //when the route is changed scroll to the proper element.
  $rootScope.$on('$routeChangeSuccess', function(newRoute, oldRoute) {
    $location.hash($routeParams.scrollTo);
    $anchorScroll();  
  });
});

并且您的链接如下所示:

<a href="#/test?scrollTo=foo">Test/Foo</a>

这是一个Plunker,展示了通过路由和$
anchorScroll进行滚动

甚至更简单:

app.run(function($rootScope, $location, $anchorScroll) {
  //when the route is changed scroll to the proper element.
  $rootScope.$on('$routeChangeSuccess', function(newRoute, oldRoute) {
    if($location.hash()) $anchorScroll();  
  });
});

并且您的链接如下所示:

<a href="#/test#foo">Test/Foo</a>


 类似资料:
  • 你们中有人知道如何在AngularJS中很好地处理锚散列链接吗? 对于一个简单的FAQ页面,我有以下标记 当点击任何上述链接AngularJS拦截和路由我到一个完全不同的页面(在我的情况下,一个404页面,因为没有匹配的链接路由。) 我的第一个想法是创建一个匹配/faq/:章的路由,并在相应的控制器中检查匹配元素后的$routeParams.chapter,然后使用jQuery向下滚动到它。 但是

  • 问题内容: 当大小超过maxthreshold值时,如何在哈希表或哈希表中进行重新哈希处理? 是否所有对都已复制到新的存储桶阵列中? 编辑: 重新哈希后,同一存储桶(位于链接列表中)中的元素会发生什么情况?我的意思是说,他们在重新哈希处理后会留在同一个桶中吗? 问题答案: 问题中的最大阈值称为负载系数。 建议负载系数约为0.75。负载因子定义为(m / n),其中n是哈希表的总大小,m是在需要增加

  • 问题内容: 可以在Angularjs中使用锚链接吗? 即: 谢谢 问题答案: 看来有几种方法可以做到这一点。 选项1:本机角度 Angular提供了一项服务,但文档严重缺乏,我无法使其正常工作。 请访问http://www.benlesh.com/2013/02/angular-js-scrolling-to-element-by- id.html, 以获取有关的一些见解。 选项2:自定义指令/本

  • 是否可以使用Angularjs锚链接? 即: 非常感谢。

  • 问题内容: 我的自定义结构实现了Hashable Protocol 。但是,当在键中插入键时发生哈希冲突时,不会自动处理它们。我该如何克服这个问题? 背景 我之前曾问过这个问题, 如何在Swift中为Int数组(自定义字符串struct)实现哈希协议。后来我添加了自己的答案,似乎很有效。 但是,最近我在使用时发现了一个细微的碰撞问题。 最基本的例子 我已将代码简化为以下示例。 定制结构 请注意,为

  • 问题内容: 使用Angular,如何添加由我的应用程序更新哈希或浏览器从URL栏或后退/前进按钮更新URL时触发的手表? 问题答案: 接受函数作为第一个参数,因此您可以执行以下操作: 但我会建议使用的事件,如为缺省路由器: 或用于ui路由器