JavaScriptを使用して、Webページをスクロールせずにwindow.location.hashを更新する方法はありますか?
すぐ下のdivの表示を切り替えるクリック可能なタイトル要素があります。タイトルをクリックするときに履歴に/foo#barが必要ですが、ページをスクロールしたくありません。したがって、/ foo#barから移動するときに、戻るボタンを使用して、IDがwindow.location.hashにあるdivを戻るときに表示することができます。
この動作は可能ですか?
JavaScriptを使用して、Webページをスクロールせずにwindow.location.hashを更新する方法はありますか?
すぐ下のdivの表示を切り替えるクリック可能なタイトル要素があります。タイトルをクリックするときに履歴に/foo#barが必要ですが、ページをスクロールしたくありません。したがって、/ foo#barから移動するときに、戻るボタンを使用して、IDがwindow.location.hashにあるdivを戻るときに表示することができます。
この動作は可能ですか?
ページをリロード/スクロールせずにハッシュを変更するには、単純に html5 を使用できるようになりhistory.pushState
ました。
history.pushState(null,null,'#hashexample');
すべての主要なブラウザーでサポートされています。
MDN:
また、ここで使用している最後の url パラメーターは、任意の url にすることができるため、ハッシュに限定されないことに注意してください。
できるだけ簡単に
var scrollmem = $('html,body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);
もう 1 つの方法は、ハッシュが指す要素の ID を一時的に変更することです。私のために働いた!
function changeHashWithoutScrolling(hash) {
var id = hash.replace(/^.*#/, ''),
elem = document.getElementById(id)
elem.id = id+'-tmp'
window.location.hash = hash
elem.id = id
}
この動作は非常に可能です。この機能を提供するために開発されたライブラリのいくつかを調べる必要があります。
本当にシンプルな歴史:http: //code.google.com/p/reallysimplehistory/ SWFAddress:http ://www.asual.com/swfaddress/
キャサリンの回答にコメントを追加したかったのですが、まだ担当者がいません-
素晴らしい解決策ですが、 $('html').scrollTop() は常に 0 を返すため、Chrome では機能しませんでした。マイナーな編集で問題が解決します。
scrollmem = $('html').scrollTop() || $('body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);
Sunny からの回答に基づいて、未定義と null も回避するこの関数を作成しました。
function changeHashWithoutScrolling(hash) {
var id;
var elem;
id = hash.replace(/^.*#/, '');
if (id) {
elem = document.getElementById(id);
if (elem) {
elem.id = id + '-tmp';
window.location.hash = hash;
elem.id = id;
}
}
}