[解決済み】AngularJSでアンカーハッシュのリンクを処理する方法
質問
でのアンカーハッシュリンクをうまく処理する方法をご存知の方はいらっしゃいますか? 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+をサポートしなければならないので、それが受け入れられる解決策であるかどうか心配です :/。
解決方法は?
あなたが探しているのは
$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>
EDIT: ルーティングで使用する場合
通常通りangularルーティングを設定し、以下のコードを追加するだけです。
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 を使ったスクロールのデモをするプランカー
そして、さらにシンプルに
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>
関連
-
[解決済み】「Uncaught TypeError: Chromeで "Illegal invocation "が発生する。
-
[解決済み】コンソールがUnterminated JSX contentsエラーを投げる【終了しました
-
[解決済み】SyntaxError: 'import' と 'export' は 'sourceType: module' とだけ表示されるかもしれない - Gulp
-
[解決済み】Javascript、[オブジェクトHTMLInputElement]を表示中。]
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] jQueryで要素が非表示になっているかどうかを確認するには?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] AngularJSでデータバインディングはどのように機能するのですか?
-
[解決済み】別のウェブページにリダイレクトするにはどうすればいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Facebook Graph API のクエリで with=location を使用すると "Uncaught (in promise) undefined" というエラーが発生する。
-
[解決済み] 解決済み】clearInterval()が動作しない [重複] [重複]
-
[解決済み】jquery $.ajaxオブジェクトのresponseJSONプロパティを取得する方法 [重複]。
-
[解決済み】Javascriptのコールバック関数がFirefoxで「Callback is not a function」というエラーを投げる
-
[解決済み】BootstrapのCollapseが折りたたまれない
-
[解決済み】未定義のプロパティ 'bind' を読み込めない。React.js【重複あり
-
[解決済み】SyntaxError: ChromeのJavascriptコンソールでUnexpected Identifierが発生する。
-
[解決済み】SyntaxError: JSON の位置 1 に予期しないトークン o があります。
-
[解決済み】Redux TypeError: 未定義のプロパティ 'apply' を読み取れない
-
[解決済み】 \u003C とは何ですか?