当前位置: 首页 > 知识库问答 >
问题:

如何处理AngularJS中的锚散列链接

祁飞飙
2023-03-14

你们中有人知道如何在AngularJS中很好地处理锚散列链接吗?

对于一个简单的FAQ页面,我有以下标记

<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/:章的路由,并在相应的控制器中检查匹配元素后的$routeParams.chapter,然后使用jQuery向下滚动到它。

但是AngularJS又在我身上大便了,而且还是滚动到页面的顶部。

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

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

共有3个答案

慕光霁
2023-03-14

没有必要改变任何路由或其他任何东西只需要使用目标="_self"当创建链接

示例:

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

并在html元素中使用id属性,如下所示:

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

没有必要使用##指出/在评论中提到;-)

劳灵均
2023-03-14

在我的例子中,我注意到如果我修改$位置,路由逻辑就会启动。hash()。下面的伎俩奏效了。。

$scope.scrollTo = function(id) {
    var old = $location.hash();
    $location.hash(id);
    $anchorScroll();
    //reset to old to keep any additional routing logic from kicking in
    $location.hash(old);
};
郦祯
2023-03-14

您正在寻找$anchorScroll()

这是(糟糕的)文档。

这是来源。

基本上,您只需注入它并在控制器中调用它,它就会将您滚动到$location中id为的任何元素。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>

这里有一个plunker来演示

编辑:将其用于布线

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

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中 很好地处理锚点哈希链接吗? 我为简单的常见问题解答页面添加了以下标记 单击上面的任何链接时,AngularJS会拦截并将我路由到一个完全不同的页面(在我的情况下是404页,因为没有路由与这些链接匹配。) 我的第一个想法是创建一个匹配“ / faq /:chapter ” 的路由,并在相应的控制器中检查匹配的元素之后,然后使用jQuery向

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

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

  • 问题内容: AngularJS依赖于启用的JavaScript。这意味着,如果有人访问用AngularJS内置的应用程序或网站,它将无法正确呈现。 使用AngularJS时,用于处理禁用了JavaScript的访客的常用约定是什么? 请解释为什么会这样? 问题包括处理有角度的JS指令和{{data_bindings}}。这样,当页面无法呈现页面时,数据就不会显示。 问题答案: 在考虑了该问题的其他

  • 问题内容: 我的公司拥有数千个现有的xml Web服务,并开始为新项目采用AngularJs。 http://angularjs.org/上的教程专门使用json服务。看起来他们在控制器中进行了服务调用,解析了生成的JSON,并将生成的对象直接传递给视图。 我该如何处理XML?我看到四个选项: 解析它,然后将DOM对象直接传递到UI(view)。 在服务器端围绕我的XML服务放置一个JSON包装器

  • 我已经尝试将JSON响应添加到Realm数据库中。我通过GSON处理响应,然后尝试转换为realm。我已经为我的响应模型类扩展了RealmObject。我还使用RealmString类通过RealmList处理列表。但当我尝试将GSON应用到领域对象时,我会出错。我正在寻找一个这样的例子,如果有人有一个。感谢所有支持。下面是我的JSON回复。