これは、FF4とIE9でのみテストしたシンプルで純粋なJavascriptソリューションです。
このソリューションは#anchor
、ページの標準タグにフォールバックすることで適切に機能を低下させる必要があるという考え方です。私がやっていることは、それらの#anchor
タグをその場でX座標とY座標に置き換え、ロード時に、クエリ文字列からそれらの値を読み取り、そこでスクロールするだけです。これが何らかの理由で失敗した場合でも、ブラウザはその#anchor
位置に移動する必要があります...
マークアップ:
<a href="/somecontroller/someaction/#someanchor">My Link</a>
jQuery:
$(function() {
// RESTORE SCROLL POSITION
RestoreScrollPosition();
// SAVE SCROLL POSITION
$('a:not(a[href^="http"])').filter('[href$="#someanchor"]').each(function() {
$(this).click(function() {
var href = $(this).attr('href').replace("#someanchor","");
if (href.indexOf('?') == -1) {
href = href + '?x='
} else {
href = href + '&x='
}
href = href + window.pageXOffset;
href = href + '&y=' + window.pageYOffset;
$(this).attr('href', href);
});
});
}
いくつかのヘルパーメソッド:
function RestoreScrollPosition() {
var scrollX = gup('x');
var scrollY = gup('y');
if (scrollX != null && scrollY != null) {
window.scrollTo(scrollX, scrollY);
return true;
}
return false;
}
function gup(name) {
name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
var regexS = "[\\?&]" + name + "=([^&#]*)";
var regex = new RegExp(regexS);
var results = regex.exec(window.location.href);
if (results == null)
return "";
else
return results[1];
}
これは私のニーズに合っていますが、より一般的/再利用可能である可能性があります-誰かがこれを改善してくれることを嬉しく思います... :-)