非レスポンシブなサイトをスマホで閲覧した時、スマホ閲覧に最適化したページに転送する簡単なjavascriptです。
もしかしたら?というか案の定というか…結構、需要は無いかもしれませんが、
先日、僕は案件でちょうどその機能を使いたい時があったので、.htaccess記述なしで実装できた時の”助かった”感が今だに忘れられず、記事にしました。
ちなみに元ネタは
ソースコピーですぐ使えてスマホ専用サイト作成に便利!PC・スマートフォンサイトの振り分けJavaScript作りました。 | HTML5でサイトをつくろう
です。いつもありがとうございます!
では、早速コードを記載いたします。
(function(){ var ua = navigator.userAgent.toUpperCase(); var url = document.location.pathname; var spDir = '/sp/'; (ua.indexOf('IPHONE') != -1 || (ua.indexOf('ANDROID') != -1 && ua.indexOf('MOBILE')? != -1))? isSP() : isPC(); function isSP(){ if(url.match(spDir)){ return false; }else{ location.href = spDir; } } function isPC(){ if(!url.match(spDir)){ return false; }else{ location.href = '/'; } } }());
1行目から意味を解説していきます。
var ua = navigator.userAgent.toUpperCase();
まずここですが前半が重要です。
navigator.userAgentでブラウザのユーザーエージェントを表す文字列を返しています。
しかしここで返される値というのは偽装(言い方が悪いですが)できてしまうので(User Agent Switcherとかで)、厳密には、あまり信用が出来ないものとして捉えられる…そうです。
window.navigator.userAgent – Web API インターフェイス | MDN
そしてそのあとのtoUpperCase()、これが必要かは謎ですが、
取得したユーザーエージェント情報を「大文字」に変換しています。
toUpperCase – JavaScript | MDN
その「ユーザーエージェント(大文字)」を、変数uaに代入しておきます。
次に、2行目の
var url = document.location.pathname;
で、現在表示中のページのパス名を返します。そのままですね。
つまり、https://satohmsys.infoがドメインで、ブログの設置場所が/blog/だとすると、
さらに表示中のページがその下層にあるワケなので、返される値としては
/blog/表示中のページURL.html
とかになります。
ちなみに、location.pathnameでドメインから表示中のページまでのパスだけを返すのに対し、location.hostnameでsatohmsys.infoを返すことが出来ます。
今回は前者を使っています。
URL情報の取得|window.locationオブジェクト|JavaScript/DOM|PHP & JavaScript Room
3行目。var spDir = ‘/sp/’;は、あらかじめ、変数spDirにスマートフォン表示用のページの存在するURLを格納しておきます。
1行空け、5行目。
ua.indexOf('IPHONE') !=-1 || ua.indexOf('ANDROID') != -1 || ua.indexOf('MOBILE')
indexOfは、引数で指定された文字列が、対象の文章の中に含まれているかどうかを検索し、取得できた場合、その出現位置を返します。「-1」というのは、取得できなかった時に返される値ですので、つまりここは
ua = navigator.userAgent.toUpperCase();
これを使って条件分岐します。
取得したユーザーエージェント情報に「IPHONE」「ANDROID」「MOBILE」という文字列が含まれている場合は…「isSP()」という関数を実行
ユーザーエージェント情報に「IPHONE」「ANDROID」「MOBILE」がどれも含まれていない場合は「isPC()」という関数を実行
という意味です。これは「三項演算子」で条件分岐してあり、ifを簡略化したものです
で、そのあとに「is_SP()」という関数を定義しているのですが、ここではまず
前半のifで、現在表示中のページがspDirのURLであるかを判断します。trueならばreturn falseです。何も返しません。
が、もしspDirと現在表示中のページのURLが一致しない場合は、location.hrefを使って、spDirに飛ばします。
つづくisPC()
という関数が、上記のisSPの逆なのですが、現在表示中のページがspDirのURLと異なれば、return falseで何も返さない→つまり、スマホ表示用ページでない=PCを表示用ページということになり、そうでなければ、location.hrefで、PC表示用のURLを指定します。ここではドメイン直下のindexファイルにジャンプするようになっています。必要に応じ、変えてください。
このファイルを外部ファイルとして読み込むだけで、UAを判断して最適化されたページに案内することが出来ます!
しかし、内容がほぼ同じならレスポンシブにしたほうが…と思っていましたが
そうも行かないケースもあるんですよね~
それにしても、先日はこのスクリプトに、本当に助けられました…
htaccessとか記述せずに、こういったことが出来るのか、と
且つ、こんなに簡単なんだ、と…
何かの機会に是非とも試してみてください!
でわ!