現象
<a href="hoge.html#huga">ほげ</a>
のような、ページ遷移を伴うページ内リンクが、iOS Safariにて上手く動作せず、遷移後のURLを見ると
http://sample.com/hoge.html
って感じでハッシュが削除されてしまう。
どうやらiOS Safariの仕様らしいので、jQueryでなんとかした。
対処
該当するaタグのhrefからハッシュの値を取り出して、代わりにクエリパラメータとして付与
<a href="hoge.html#huga">ほげ</a>
↓
<a href="hoge.html?js-hash=huga">ほげ</a>
クエリパラメータjs-hash
を持ってアクセスしたときに、その値と一致するidを持つ要素にスクロールするようにした。
コード
下記のコードを全ページで読み込ませた。
$(function(){
var ua = navigator.userAgent;
//iOSのみ対応
if(/iPhone/.test(ua) || /iPad/.test(ua)) {
//ページをまたいだページ内リンクのハッシュをクエリパラメータに変換
$('a[href*=#]').each(function(){
var orgHref = $(this).attr('href');
var index = orgHref.lastIndexOf("#");
//通常のページ内リンクは対象外とする
if(index != 0) {
var hash = orgHref.substr(index).substr(1);
var href = orgHref.substr(0,index);
if(href.match(/\?/)) {
var connector = '&';
} else {
var connector = '?';
}
$(this).attr('href',href + connector + 'js-hash=' + hash);
}
});
//クエリパラメータに[js-hash]が存在したときの処理
if(getQueryVariable('js-hash')) {
var target = $('#' + getQueryVariable('js-hash'));
offsetTop = target.offset().top;
$('html, body').animate({scrollTop:offsetTop}, 500);
}
}
//指定したクエリパラメータの値を返す
function getQueryVariable(variable) {
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i=0;i<vars.length;i++) {
var pair = vars[i].split("=");
if (pair[0] == variable) {
return pair[1];
}
}
return(false);
}
});
参照ドキュメント
クエリパラメータ取り出し方はこちらを参照した
https://css-tricks.com/snippets/javascript/get-url-variables/