AngularJS에서 앵커 해시 링크를 처리하는 방법


318

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 / : chapter "와 일치하는 경로를 만들고 해당 컨트롤러 $routeParams.chapter에서 일치하는 요소를 확인한 다음 jQuery를 사용하여 아래로 스크롤하는 것입니다.

그러나 AngularJS는 다시 나를 괴롭 히고 어쨌든 페이지 상단으로 스크롤합니다.

그래서 여기에 누군가가 과거에 비슷한 일을하고 그것에 대한 좋은 해결책을 알고 있습니까?

편집 : html5Mode로 전환하면 문제가 해결되지만 어쨌든 IE8 +를 지원해야하므로 허용되는 솔루션이 아니라고 두려워합니다.


나는 각도가 ng-href=""대신 사용하는 것이 좋습니다.
피기 백

10
ng-href는 URL에 ng-model에 바인딩 해야하는 동적 데이터가 포함 된 경우에만 적용 할 수 있다고 생각합니다. :이 링크 ID의에의 무시한다면 나는 어떤 경이의 당신은 locationProvider에 hashPrefix를 할당하는 경우 docs.angularjs.org/guide/dev_guide.services.$location
아담

Adam은 ng-href 사용법이 정확합니다.
Rasmus


이 또한 새로운 각도에 대한 문제입니다 stackoverflow.com/questions/36101756/...
phil294

답변:


375

찾고 있습니다 $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>

다음은 라우팅과 $ anchorScroll을 사용한 스크롤을 보여주는 Plunker입니다.

그리고 더 간단합니다.

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>

5
라우팅을 추가 할 때 문제가 발생할 수 있습니다. ngView를 추가하면 URL의 해시가 변경 될 때마다 경로 다시로드가 트리거됩니다 ... 예를 들어 라우팅이없고 URL에 현재 항목이 반영되지 않습니다. 그러나 $ anchorScroll
Valentyn Shybanov

1
라우팅이 뷰를 제어하므로 @blesh, location.hash (X)를 호출하면 페이지가 변경됩니다.
dsldsl

24
이 솔루션을 사용하면 전체 응용 프로그램이 다시 렌더링됩니다.

2
@dsldsl && @OliverJosephAsh : $ location.hash ()는 페이지를 다시로드하지 않습니다. 그렇다면 다른 일이 있습니다. 다음은 페이지가로드 될 때 쓰여지는 시간과 동일한 plunk입니다. 변경되지 않습니다 . 경로를 다시로드하지 않고 현재 페이지의 앵커 태그로 스크롤하려면 경로를 다시 지정하십시오. 일반 링크 <a href="#foo">foo</a>. 내 코드 샘플은 routechange에서 id로 스크롤하는 것을 보여주었습니다.
벤 레시

4
@ blesh : 원하는 섹션으로 스크롤 한 후 해시를 제거하는 것이 좋습니다.이 방법으로 URL은 실제로는 없어야하는 것으로 오염되지 않습니다. 이것을 사용하십시오 : $location.search('scrollTo', null)
kumarharsh

168

필자의 경우을 수정하면 라우팅 논리가 시작되고 있음을 알았습니다 $location.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);
};

5
@blesh의 .run (...) 솔루션을 사용할 때조차도 라우팅 로직이 절대로 동작하지 않기 때문에 이것을 고맙게 생각합니다.
ljs

8
"오래된 해시 저장"기법은 절대 생명의 은인이었습니다. 경로를 깨끗하게 유지하면서 페이지가 다시로드되는 것을 방지합니다. 대단한 아이디어!
ThisLanham

2
좋은 것. 그러나 솔루션을 구현 한 후에는 URL이 대상 ID의 값을 업데이트하지 않습니다.
Mohamed Hussain

1
나는 Mohamed와 같은 경험을했습니다 ... 실제로 재로드를 중단했지만 해시리스 경로를 표시합니다 ($ anchorScroll은 효과가 없었습니다). 1.2.6 흠.
마이클

3
사용 $location.hash(my_id); $anchorScroll; $location.hash(null)합니다. 그것은 다시로드를 방지하고 old변수 를 관리 할 필요가 없습니다 .
MFB

53

라우팅을 변경할 필요가 없으며 target="_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>

주석에서 지적 / 언급 된대로 # #을 사용할 필요가 없습니다 ;-)


1
이것은 나를 위해 작동하지 않았지만 여기의 해결책은 다음과 같습니다. stackoverflow.com/a/19367249/633107
Splaktar

6
이 솔루션에 감사드립니다. 그러나 target = "_ self"이면 충분합니다. #
Christophe P

5
target = "_ self"는 확실히 가장 좋은 대답입니다 (Christophe P가 지적한 것처럼 #을 두 배로 늘릴 필요가 없습니다). Html5Mode가 켜져 있는지 여부에 관계없이 작동합니다.
newman

3
간단하고 완벽합니다. 또 다른 각도 의존성을 추가 할 필요없이 나를 위해 일했습니다.
adeady

4
이것이 올바른 솔루션입니다. 각 $ anchorScroll 서비스가 필요하지 않습니다. 태그에 대한 설명서를 참조하십시오 : https://developer.mozilla.org/en/docs/Web/HTML/Element/a
Yiling

41
<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="faq-3">Question 3</h3>

대박! 지금까지 가장 간단한 해결책이지만 별도의 페이지에서 앵커에 연결하는 방법을 알고 있습니까? (즉 / products # books)
8bithero

나는 AngularJS와의 (/ 제품 ## 책) 솔루션과 같은 생각
lincolnge

1
내 경험에 따르면 href = "##"은 $ anchorScroll이 주입 된 경우에만 작동합니다.
Brian Park

9
이것은 비교적 단순 해 보이지만 작동하지 않습니다 :-(
brykneval

4
target = "_ self"를 추가했으며 페이지 내 모든 유형의 탐색에 매력처럼 작동했습니다 (슬라이더 읽기, 다른 섹션으로 이동 등). 이 위대하고 간단한 트릭을 공유해 주셔서 감사합니다.
Kumar Nitesh

19

항상 경로를 알고 있다면 다음과 같이 앵커를 간단히 추가 할 수 있습니다.

href="#/route#anchorID

여기서 route현재 각 경로이며 anchorID일치하는 <a id="anchorID">페이지에 어딘가에


1
이것은 일반적인 AngularJS 경로 변경을 유발하므로 권장하지 않습니다. 제 경우에는 FAQ / 도움말 페이지의 YouTube 비디오가 새로 고침 된 이후 매우 시각적이었습니다.
Robin Andersson

9
@ RobinWassén-Andersson은 reloadOnSearch: false경로 설정에서 해당 경로를 지정 하여 경로 변경을 트리거하지 않고 ID로 스크롤합니다. a태그에 지정된 전체 경로와 함께 이것이 가장 간단하고 간단한 솔루션이라고 말할 수 있습니다.
엘리스

감사합니다. 이것은 나를 도왔다. 내 앱에서 사용자 지정 경로를 사용하지 않으므로 href = "# / # anchor-name"을 수행하는 것이 좋습니다!
Jordan

14

$anchorScroll 이를 위해 작동하지만 최신 버전의 Angular에서 사용하는 훨씬 더 좋은 방법이 있습니다.

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

이것은 경로에 전혀 영향을 미치지 않기 때문에 가장 좋은 솔루션입니다. 나는 최대한 빨리 설정으로 다시 것 ngRoute 및 경로를 사용하고 있기 때문에 작업에 다른 솔루션 중 하나를 얻을 수 없었다 $location.hash(id)전에,$anchorScroll 그 마술을 할 수 있습니다.

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

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

그리고보기에서 :

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

또한 고정 탐색 메뉴 (또는 다른 UI)를 고려해야하는 경우 다음과 같이 주 모듈의 실행 기능에서 $ anchorScroll의 오프셋을 설정할 수 있습니다.

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

감사. 경로 변경과 결합 된 해시 링크에 대한 전략을 어떻게 구현 하시겠습니까? 예 :이 탐색 항목을 클릭하면 다른보기가 열리고 id해당보기 의 특정 항목으로 스크롤됩니다 .
Kyle Vassella

pery to ster .. 기회가된다면 내 Stack 질문을 한 눈에 볼 수 있습니까? 나는 당신의 대답이 너무 가까워 졌다고 생각하지만 그것을 구현할 수는 없습니다 : stackoverflow.com/questions/41494330/… . 나도 ngRoute최신 버전의 Angular를 사용 하고 있습니다.
Kyle Vassella

죄송합니다. 특정 사례를 시도하지 않았지만 $ location.search () 또는 $ routeParams를 살펴 보셨습니까 ? 아마도 당신은 컨트롤러를 초기화 할 때 하나 또는 다른 것을 사용할 수 있습니다-scrollTo 검색 매개 변수가 URL에 있으면 컨트롤러는 위와 같이 $ anchorScroll을 사용하여 페이지를 스크롤 할 수 있습니다.
Rebecca

2
Id를 $ anchorScroll에 직접 전달함으로써 내 경로는 / contact # contact에서 / contact로 변경되었습니다. 이 답변은 허용되는 답변이어야합니다.
RandomUs1r 2016 년

12

이것은 DOM을 다루기 때문에 더 Angular-y 인 지시문을 사용하는 솔루션이었습니다.

여기에 Plnkr

깃 허브

암호

angular.module('app', [])
.directive('scrollTo', function ($location, $anchorScroll) {
  return function(scope, element, attrs) {

    element.bind('click', function(event) {
        event.stopPropagation();
        var off = scope.$on('$locationChangeStart', function(ev) {
            off();
            ev.preventDefault();
        });
        var location = attrs.scrollTo;
        $location.hash(location);
        $anchorScroll();
    });

  };
});

HTML

<ul>
  <li><a href="" scroll-to="section1">Section 1</a></li>
  <li><a href="" scroll-to="section2">Section 2</a></li>
</ul>

<h1 id="section1">Hi, I'm section 1</h1>
<p>
Zombie ipsum reversus ab viral inferno, nam rick grimes malum cerebro. De carne lumbering animata corpora quaeritis. 
 Summus brains sit​​, morbo vel maleficia? De apocalypsi gorger omero undead survivor dictum mauris. 
Hi mindless mortuis soulless creaturas, imo evil stalking monstra adventus resi dentevil vultus comedat cerebella viventium. 
Nescio brains an Undead zombies. Sicut malus putrid voodoo horror. Nigh tofth eliv ingdead.
</p>

<h1 id="section2">I'm totally section 2</h1>
<p>
Zombie ipsum reversus ab viral inferno, nam rick grimes malum cerebro. De carne lumbering animata corpora quaeritis. 
 Summus brains sit​​, morbo vel maleficia? De apocalypsi gorger omero undead survivor dictum mauris. 
Hi mindless mortuis soulless creaturas, imo evil stalking monstra adventus resi dentevil vultus comedat cerebella viventium. 
Nescio brains an Undead zombies. Sicut malus putrid voodoo horror. Nigh tofth eliv ingdead.
</p>

$ anchorScroll 서비스를 사용했습니다. 해시 변경과 함께 진행되는 페이지 새로 고침을 막기 위해 locationChangeStart 이벤트를 취소했습니다. 도움말 페이지가 ng-switch에 연결되어 있고 새로 고침이 앱을 본질적으로 손상시킬 수 있기 때문에 이것은 나를 위해 일했습니다.


지시어 솔루션이 마음에 듭니다. 그러나 어떻게하면 다른 페이지를로드하고 동시에 앵커 위치로 스크롤하려고했습니다. angularjs가 없으면 일반적으로 href = "location # hash"가됩니다. 그러나 귀하의 지시는 페이지 재로드를 방지합니다.
CMCDragonkai

내 지시문이있는 @CMCDragonkai, $ anchorScroll 호출을 사용하기 때문에 현재 페이지에있는 요소로 스크롤하는 것만 큼 확실하지 않습니다. 페이지 변경과 관련된 것을 얻으려면 $ location 또는 $ window 로 엉망이 될 수 있습니다 .
KhalilRavanna

2
locationChangeStart 이벤트에서 서브 스크라이브를 해제해야합니다. var off = scope. $ on ( '$ locationChangeStart', function (ev) {off (); ev.preventDefault ();});

@EugeneTskhovrebov를 잘 잡았습니다. 저는 편집에서 답변에 추가했습니다.
KhalilRavanna

5

각도 경로에 해시 접두사를 설정하십시오. $locationProvider.hashPrefix('!')

전체 예 :

angular.module('app', [])
  .config(['$routeProvider', '$locationProvider', 
    function($routeProvider, $locationProvider){
      $routeProvider.when( ... );
      $locationProvider.hashPrefix('!');
    }
  ])

이것은 결과에 영향을 미치지 않습니다. 그래도 달콤한 것입니다.
Rasmus

2
확실합니까. 왜 작동하지 않습니까? 해시 접두사가!이면 해시 라우팅은 #! page 여야합니다. 따라서 AngularJS는 #hash 일 때를 감지해야하며 스크롤을 자동으로 고정하고 HTML5 모드 URL과 해시 모드 URL 모두에서 작동해야합니다.
CMCDragonkai

5

내 앱의 경로 논리 에서이 문제를 해결했습니다.

function config($routeProvider) {
  $routeProvider
    .when('/', {
      templateUrl: '/partials/search.html',
      controller: 'ctrlMain'
    })
    .otherwise({
      // Angular interferes with anchor links, so this function preserves the
      // requested hash while still invoking the default route.
      redirectTo: function() {
        // Strips the leading '#/' from the current hash value.
        var hash = '#' + window.location.hash.replace(/^#\//g, '');
        window.location.hash = hash;
        return '/' + hash;
      }
    });
}

1
오류 : [$ 인젝터 : modulerr] 인스턴스화 모듈 각도로 실패로 인해 오류 :이 작업을하지 않는 잘못된 '핸들러'를 할 때 ()
geoidesic

5

이것은 오래된 게시물이지만 다양한 솔루션을 연구하는 데 오랜 시간을 보냈으므로 하나 더 간단한 것을 공유하고 싶었습니다. 태그에 추가 target="_self"하면 문제가 <a>해결되었습니다. 링크가 작동하여 페이지의 올바른 위치로 이동합니다.

그러나 Angular는 여전히 URL에서 #에 약간의 이상한 점을 삽입 하므로이 방법을 사용한 후 탐색을 위해 뒤로 버튼을 사용하는 데 문제가 발생할 수 있습니다.


4

이것은 ngView의 새로운 속성 일지 모르지만 속성과 '더블 해시' 를 angular-route사용하여 앵커 해시 링크를 사용할 수있었습니다 ngView autoscroll.

ngView (자동 스크롤 참조)

(다음 코드는 각도 스트랩과 함께 사용되었습니다)

<!-- use the autoscroll attribute to scroll to hash on $viewContentLoaded -->    
<div ng-view="" autoscroll></div>

<!-- A.href link for bs-scrollspy from angular-strap -->
<!-- A.ngHref for autoscroll on current route without a location change -->
<ul class="nav bs-sidenav">
  <li data-target="#main-html5"><a href="#main-html5" ng-href="##main-html5">HTML5</a></li>
  <li data-target="#main-angular"><a href="#main-angular" ng-href="##main-angular" >Angular</a></li>
  <li data-target="#main-karma"><a href="#main-karma" ng-href="##main-karma">Karma</a></li>
</ul>

3

나는 이렇게 할 수있다 :

<li>
<a href="#/#about">About</a>
</li>

2

다음은 지정된 요소 (하드 코드 된 "faq")로 스크롤 할 사용자 지정 지시문을 만들어서 해결하는 방법입니다.

app.directive('h3', function($routeParams) {
  return {
    restrict: 'E',
    link: function(scope, element, attrs){        
        if ('faq'+$routeParams.v == attrs.id) {
          setTimeout(function() {
             window.scrollTo(0, element[0].offsetTop);
          },1);        
        }
    }
  };
});

http://plnkr.co/edit/Po37JFeP5IsNoz5ZycFs?p=preview


이것은 실제로 작동하지만, 말한 것처럼 더럽습니다. 매우 더럽습니다. 다른 사람이 더 예쁜 솔루션을 만들 수 있는지 확인하십시오. 그렇지 않으면이 문제를 해결해야합니다.
Rasmus 2019

Angular에는 이미를 통해 scrollTo 기능이 내장되어 $anchorScroll있습니다. 내 답변을 참조하십시오.
Ben Lesh

플런저가 덜 오염되도록 변경되었습니다. $ location.path ()를 사용하므로 소스에 하드 코드 된 "faq"가 없습니다. 또한 $ anchorScroll를 사용하려고했으나 인해 라우팅 보인다 그것을하지 작업 ... 수행
Valentyn Shybanov

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

2

사용하지 않으려면 ng-click여기에 다른 해결책이 있습니다. filter현재 상태를 기반으로 올바른 URL을 생성하기 위해 a 를 사용합니다 . 내 예제는 ui.router 를 사용 합니다 .

이점은 사용자가 링크로 이동하는 위치를 볼 수 있다는 것입니다.

<a href="{{ 'my-element-id' | anchor }}">My element</a>

필터 :

.filter('anchor', ['$state', function($state) {
    return function(id) {
        return '/#' + $state.current.url + '#' + id;
    };
}])

2

ng-route가있는 내 솔루션은 다음과 같은 간단한 지시문이었습니다.

   app.directive('scrollto',
       function ($anchorScroll,$location) {
            return {
                link: function (scope, element, attrs) {
                    element.click(function (e) {
                        e.preventDefault();
                        $location.hash(attrs["scrollto"]);
                        $anchorScroll();
                    });
                }
            };
    })

HTML은 다음과 같습니다

<a href="" scrollTo="yourid">link</a>

속성을 지정하고 scroll-to="yourid"지시문의 이름 을 지정할 필요가 없습니까 scrollTo(및 속성에 액세스 attrs["scrollTo"]하시겠습니까? 게다가 명시적인 jQuery 포함없이 처리기는 바운드해야 element.on('click', function (e) {..})합니다.
Theodros Zelleke

1

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>

1

Angular 앱을 앵커 opon로드로 스크롤하고 $ routeProvider의 URL 다시 쓰기 규칙을 실행하려고했습니다.

오랜 실험 끝에 나는 이것에 정착했다.

  1. Angular 앱 모듈의 .run () 섹션에서 document.onload 이벤트 핸들러를 등록하십시오.
  2. 핸들러에서 일부 문자열 작업을 수행하여 원본에 앵커 태그가 있어야하는 것을 찾으십시오.
  3. $ routeProvider가 "# /"규칙으로 즉시 다시 덮어 쓰는 위치 고정 앵커 태그를 사용하여 location.hash를 재정의합니다. 그러나 Angular는 이제 URL 4에서 진행중인 작업과 동기화되므로 괜찮습니다. $ anchorScroll ().

angular.module("bla",[]).}])
.run(function($location, $anchorScroll){
         $(document).ready(function() {
	 if(location.hash && location.hash.length>=1)    		{
			var path = location.hash;
			var potentialAnchor = path.substring(path.lastIndexOf("/")+1);
			if ($("#" + potentialAnchor).length > 0) {   // make sure this hashtag exists in the doc.                          
			    location.hash = potentialAnchor;
			    $anchorScroll();
			}
		}	 
 });


1

이것이 항상 작동하는지 100 % 확신하지는 않지만 응용 프로그램에서 이것은 예상되는 동작을 제공합니다.

ABOUT 페이지에 있고 다음 경로가 있다고 가정 해 봅시다 .

yourApp.config(['$routeProvider', 
    function($routeProvider) {
        $routeProvider.
            when('/about', {
                templateUrl: 'about.html',
                controller: 'AboutCtrl'
            }).
            otherwise({
                redirectTo: '/'
            });
        }
]);

이제 HTML에서

<ul>
    <li><a href="#/about#tab1">First Part</a></li>
    <li><a href="#/about#tab2">Second Part</a></li>
    <li><a href="#/about#tab3">Third Part</a></li>                      
</ul>

<div id="tab1">1</div>
<div id="tab2">2</div>
<div id="tab3">3</div>

결론적으로

앵커 앞에 페이지 이름을 포함 시키면 나에게 속임수가되었습니다. 당신의 생각에 대해 알려주세요.

단점

그러면 페이지가 다시 렌더링되고 앵커로 스크롤됩니다.

최신 정보

더 좋은 방법은 다음을 추가하는 것입니다.

<a href="#tab1" onclick="return false;">First Part</a>

1

스크롤 기능을 쉽게 사용하십시오. 또한 추가 기능으로 Animated / Smooth 스크롤 을 지원 합니다. 각도 스크롤 라이브러리의 세부 사항 :

Github - https: //github.com/oblador/angular-scroll

바우어 :bower install --save angular-scroll

npm :npm install --save angular-scroll

축소 버전-9kb

부드러운 스크롤 (애니메이션 스크롤) -예

스크롤 스파이 -예

문서 -우수

데모-http : //oblador.github.io/angular-scroll/

도움이 되었기를 바랍니다.


1

@Stoyan을 기반으로 다음 솔루션을 생각해 냈습니다.

app.run(function($location, $anchorScroll){
    var uri = window.location.href;

    if(uri.length >= 4){

        var parts = uri.split('#!#');
        if(parts.length > 1){
            var anchor = parts[parts.length -1];
            $location.hash(anchor);
            $anchorScroll();
        }
    }
});

0

경로 변경시 페이지 상단으로 스크롤됩니다.

 $scope.$on('$routeChangeSuccess', function () {
      window.scrollTo(0, 0);
  });

이 코드를 컨트롤러에 넣으십시오.


0

내 마음에 @slugslog가 있었지만 한 가지를 바꿀 것입니다. 대신 replace를 사용하여 다시 설정할 필요가 없습니다.

$scope.scrollTo = function(id) {
    var old = $location.hash();
    $location.hash(id).replace();
    $anchorScroll();
};

문서 검색에서 "바꾸기 방법"


0

위의 해결책 중 어느 것도 나를 위해 작동하지 않지만 방금 시도했지만 효과가있었습니다.

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

따라서 색인 페이지로 시작한 다음 기존 앵커를 사용하도록 페이지에 알리는 것이 필요하다는 것을 깨달았습니다.


0

때로는 angularjs 응용 프로그램 해시 탐색이 작동하지 않으며 부트 스트랩 jquery 자바 스크립트 라이브러리는이 유형의 탐색을 광범위하게 사용 target="_self"하여 앵커 태그에 추가 되도록합니다. 예 :<a data-toggle="tab" href="#id_of_div_to_navigate" target="_self">



0

AngularJS 1.3.15를 사용하고 있으며 특별한 작업을 할 필요가없는 것처럼 보입니다.

https://code.angularjs.org/1.3.15/docs/api/ng/provider/ $ anchorScrollProvider

따라서 다음은 내 HTML에서 작동합니다.

<ul>
  <li ng-repeat="page in pages"><a ng-href="#{{'id-'+id}}">{{id}}</a>
  </li>
</ul>
<div ng-attr-id="{{'id-'+id}}" </div>

컨트롤러 나 JavaScript를 전혀 변경할 필요가 없었습니다.

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