JavaScriptを使用して、Webページをスクロールせずにwindow.location.hashを更新する方法はありますか?
すぐ下のdivの表示を切り替えるクリック可能なタイトル要素があります。タイトルをクリックするときに履歴に/ foo#barが必要ですが、ページをスクロールしたくありません。したがって、/ foo#barから移動するときに、戻るボタンを使用して、IDがwindow.location.hashにあるdivを戻るときに表示することができます。
この動作は可能ですか?
この動作は非常に可能です。この機能を提供するために開発されたライブラリのいくつかを調べる必要があります。
本当に単純な履歴: http://code.google.com/p/reallysimplehistory/ SWFAddress: http://www.asual.com/swfaddress/
ページをリロード/スクロールせずにハッシュを変更するには、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
}
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;
}
}
}
キャサリンの回答にコメントを追加したかったのですが、まだ担当者がいません-
素晴らしい解決策ですが、Chrome as $( 'html')。scrollTop()は常に0を返すため、私にとっては機能しませんでした-マイナーな編集で問題が解決します:
scrollmem = $('html').scrollTop() || $('body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);