Angularjs의 앵커 링크?


78

Angularjs에서 앵커 링크를 사용할 수 있습니까?

즉 :

 <a href="#top">Top</a>
 <a href="#middle">Middle</a>
 <a href="#bottom">Bottom</a>

 <div name="top"></div>
 ...
 <div name="middle"></div>
 ...
 <div name="bottom"></div>

감사합니다


13
음, AngularJS와는 ... 그것의 자신의 라우팅 시스템을 통해 해당 링크 및 경로를 차단
안드리 Drozdyuk

답변:


106

이를 수행하는 몇 가지 방법이있는 것 같습니다.

옵션 1 : 기본 각도

Angular는 $anchorScroll 서비스를 제공하지만 문서가 심각하게 부족하여 작동하지 못했습니다.

http://www.benlesh.com/2013/02/angular-js-scrolling-to-element-by-id.html 확인 대한 통찰력은 을$anchorScroll .

옵션 2 : 사용자 지정 지시문 / 기본 JavaScript

내가 테스트 한 또 다른 방법은 사용자 지정 지시문을 만들고 el.scrollIntoView(). 이것은 기본적으로 지시문 링크 함수에서 다음을 수행하여 꽤 괜찮게 작동합니다.

var el = document.getElementById(attrs.href);
el.scrollIntoView();

그러나 브라우저가 기본적으로 지원할 때이 두 가지를 모두 수행하는 것은 약간 과장된 것 같습니다.

옵션 3 : Angular Override / Native Browser

http://docs.angularjs.org/guide/dev_guide.services.$location 및 HTML 링크 재 작성 섹션을 살펴보면 다음에서 링크가 재 작성되지 않음을 알 수 있습니다.

대상 요소를 포함하는 링크

예: <a href="https://stackoverflow.com/ext/link?a=b" target="_self">link</a>

따라서 다음 target과 같이 링크에 속성을 추가하기 만하면됩니다.

<a href="#anchorLinkID" target="_self">Go to inpage section</a>

Angular는 기본적으로 브라우저로 설정되며 다른 기본 URL이 아닌 앵커 링크이므로 브라우저는 원하는대로 올바른 위치로 스크롤합니다.

여기에서는 기본 브라우저 기능에 의존하는 것이 가장 좋고 시간과 노력을 절약 할 수 있기 때문에 옵션 3을 선택했습니다.

성공적인 스크롤 및 해시 변경 후 Angular는 후속 작업을 수행하고 해시를 사용자 지정 스타일로 다시 작성합니다. 그러나 브라우저는 이미 사업을 완료했으며 당신은 갈 수 있습니다.


1
불행히도 주소 표시 줄의 추가 해시로 인해 남은 부작용이 많이 있습니다. 여기에서 옵션 2가 훨씬 더 효과적이라는 것을 알았습니다. : 누군가가 이미 부팅, 지시어를 썼다 ngmodules.org/modules/ngScrollTo
라일 라크

여기 옵션 2는 특히 라우팅을 사용하는 경우 가장 간단합니다. Bootstrap을 사용하는 계층화 된 탭에 문제가 있었고 Opt2는 그것을 어리석은 단순하게 만들었습니다. 감사합니다
Dameo

4
target = "_ self"를 설정하는 데 한 가지 문제가 있습니다. 이 링크 stackoverflow.com/#footer 와 같은 것을 누군가에게 제공 하면 바닥 글로 이동하지 않습니다. <a href="#footer" target="_self"> 바닥 글로 이동 </a>을 클릭 한 경우에만 바닥 글로 이동합니다. 이상형? 나는 보통 친구가 집중해야 할 부분을 보여주기 위해 그런 링크를 제공하기 때문에 중요합니다.
라이언

3
불행히도 옵션 3은 localhost : 9000 / # / case / 1 # medical 대신 웹 사이트 .ie localhost : 9000 / # medical 의 루트로 리디렉션합니다 . _self 대상으로도.
라파엘

1
옵션 3은 "건너 뛰기"링크를 위해 환상적으로 작동했습니다! 감사합니다!
Lane Sawyer

27

그것이 귀하의 질문에 대한 답인지 모르겠지만 예, 다음과 같은 angularjs 링크를 사용할 수 있습니다.

<a ng-href="http://www.gravatar.com/avatar/{{hash}}"/>

AngularJS 웹 사이트에 좋은 예가 있습니다.

http://docs.angularjs.org/api/ng.directive:ngHref

업데이트 : AngularJS 문서는 약간 모호했으며 이에 대한 좋은 솔루션을 제공하지 않았습니다. 죄송합니다!

여기에서 더 나은 솔루션을 찾을 수 있습니다. AngularJS에서 앵커 해시 링크를 처리하는 방법


나도 @drozzy : 사용중인 AngularJS 버전을 알려주시겠습니까? 덕분에
아나

1
트릭은 href 속성 을 갖는 것입니다. 너희들 그렇게하는거야?
Andriy Drozdyuk 2013-08-09

1
ng-href를 사용 하는 것 외에도 빈 href가 필요 하다는 것이 어디에 문서화되어 있습니까?
alearg

두 번째 링크가 작동 했으므로 동일한 페이지에 있으면 라우팅에 대해 걱정할 필요가 없습니다. 훌륭하게 일했습니다.
Mastro

24

anchorScroll 을 사용할 수 있습니다 .

따라서 컨트롤러는 다음과 같습니다.

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

그리고보기 :

<a href="" ng-click="scrollTo('foo')">Scroll to #foo</a>

... 그리고 앵커 ID에 대한 비밀은 없습니다.

<div id="foo">
  This is #foo
</div>

2
참고 : 자동 으로 감시 하므로 호출 $anchorScroll()$location.hash()호출은 불필요합니다 (). $anchorScroll$location.hash
PLPeeters

문서 는 예제에서 $ anchorScroll () 을 호출 하지만 @Edmar가 맞습니다. 생략하면 $anchorScroll()여전히 새 위치로 스크롤됩니다.
twknab

7

$ anchorScroll은 실제로 이것에 대한 답이지만 Angular의 최신 버전에서 사용하는 훨씬 더 좋은 방법이 있습니다.

이제 $ anchorScroll은 해시를 선택적 인수로 허용하므로 $ location.hash를 전혀 변경할 필요가 없습니다. ( 문서 )

이것은 경로에 전혀 영향을주지 않기 때문에 최상의 솔루션입니다. ngRoute를 사용하고 있고 $location.hash(id)$ anchorScroll이 마법을 수행하기 전에 내가 설정하자마자 경로가 다시로드되기 때문에 다른 솔루션을 사용할 수 없었습니다.

사용 방법은 다음과 같습니다. 먼저 지시문 또는 컨트롤러에서 :

$scope.scrollTo = function (id) {
  $anchorScroll(id);  
}

그런 다음보기에서 :

<a href="" ng-click="scrollTo(id)">Text</a>

또한 고정 된 navbar (또는 기타 UI)를 고려해야하는 경우 다음과 같이 $ anchorScroll의 오프셋을 설정할 수 있습니다 (메인 모듈의 실행 함수에서).

  .run(function ($anchorScroll) {
      //this will make anchorScroll scroll to the div minus 50px
      $anchorScroll.yOffset = 50;
  });


1

나를 위해 작동 :

 <a onclick='return false;' href="" class="collapsed" role="button" data-toggle="collapse" data-parent="#accordion" ng-href="#profile#collapse{{$index}}"> blalba </a>

1

링크에 target = "_ self"만 추가하면됩니다.

전의. <a href="#services" target="_self">Services</a><div id="services"></div>


angular.js / 1.6.10에서 테스트하고 잘 작동, 내가 대답을 편집 더 명확하게하기
Farzad.Kamali

갈등을 일으키는 무언가가 될 수 있습니까? 나는 정확히 같은 코드가
대니

0

또는 간단히 다음과 같이 작성할 수 있습니다.

ng-href="\#yourAnchorId"

해시 기호 앞에있는 백 슬래시를 확인하세요.


아니요, 우연히이 솔루션을 찾았습니다.
Marko

이것이 작동하는지 또는 작동하는지 테스트 한 사람이 있습니까?
JustGoscha

ng-href="##anchorId"나를 위해 작동합니다 (Angular 1.2.21). 이것이 $ location.hash ( 'anchorId')가하는 일입니다.
PSWai

9
NG-HREF = "\ # myAnchorTag는"나를 위해 작동하지 않았다도 겨-HREF = "## anchorId"한
맥그로

0

SharePoint 및 angular를 사용하는 경우 다음과 같이하십시오.

<a ng-href="{{item.LinkTo.Url}}" target="_blank" ng-bind="item.Title;" ></a> 

LinkTo 및 Title은 SharePoint 열입니다.


0

나에게 가장 좋은 선택은 작업을 할 수있는 지침을 만들 수 있기 때문에 것이었다 $location.hash()$anchorScroll()내 SPA 라우팅에 문제를 많이 만드는 URL을 납치.

MyModule.directive('myAnchor', function() {
  return {
    restrict: 'A',
    require: '?ngModel',
    link: function(scope, elem, attrs, ngModel) {
      return elem.bind('click', function() {
        //other stuff ...
        var el;
        el = document.getElementById(attrs['myAnchor']);
        return el.scrollIntoView();
      });      
    }
  };
});

0

컨트롤러 내부에서 HTML ID로 이동할 수도 있습니다.

$location.hash('id_in_html');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.