10
14

More than 5 years have passed since last update.

iOS Safariで、ページ遷移を伴うページ内リンクが動作しない問題をjQueryで何とかする

Last updated at Posted at 2015-05-14

現象

<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/

10
14
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
14