SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

クロスブラウザスクリプトの作成テクニック

ブラウザに合わせたスクリプトを実行する

クロスブラウザスクリプトの作成テクニック 第4回


ブラウザに合わせてページを振り分ける

 ここでは、『Sample_1.html』のスクリプトを応用したサンプルを紹介します。ブラウザを判断し、ブラウザに合わせて用意した各ページへ移動するスクリプトを見てみましょう。

 ブラウザには、機能的に大きな変化があったバージョンがあります。前のサンプルでは、ブラウザの種類やそのバージョンを1種類ずつ判断していました。それを今度は、大きく変更があったバージョンのブラウザを、ある程度まとめて振り分けるようにします。

 ブラウザの種類やバージョンによる違いに合わせて最適化されたページに振り分けるといった処理は、以前からよく行われてきました。JavaScriptが出てくるまではCGIなどを使って、サーバー側で行う必要がありましたが、JavaScriptがサポートされてからは、ブラウザ側で行えるようになったのです。そういった意味では、この処理は最もJavaScriptらしい処理の一つと言えます。

 今回、ブラウザの振り分け方は次のようにします。

  • Netscape Navigatorのバージョン2および3、Internet Explorerのバージョン3は、古いブラウザ用のページへ振り分ける。
  • スタイルシートがサポートされたInternet Explorerのバージョン4は、Internet Explorer 4用のページに振り分ける。
  • スタイルシートはサポートされたが、完全ではなかったNetscape Navigatorのバージョン4は、Netscape Navigator 4用のページに振り分ける。
  • Netscape Navigatorのバージョン6、7、8は、機能的な変化はほとんどないので同じページに振り分ける。
  • 同様に描画に関する機能にあまり差がないFirefoxとMozillaも、同じページに振り分ける。
  • 機能的にそれほど差がないInternet Explorerのバージョン5と6も、同じページに振り分ける。
  • ただし、Internet Explorerのバージョン6のSP2版は、セキュリティ関連の機能が数多く追加されているので、別のページに振り分ける。
  • Opera、Safariは、それぞれの専用ページへ振り分ける。

 それではサンプルを見ていきましょう(Sample_2.html)。実際に試す場合は、サンプル以外にも、それぞれのブラウザ用のページを用意しておいてください。

Sample_2 ブラウザに合わせてページを振り分ける
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta http-equiv="Content-Style-Type" content="text/css">
<title></title>
<style type="text/css">
<!--
body { background-color: #ffffff; }
-->
</style> </head> <body> *各ブラウザ専用ページに振り分ける <p> <script type="text/javascript"> <!--
document.write("ブラウザ判別中...");
//-->
</script> </p> <noscript> <a href="No_Script.html">JavaScript未対応ブラウザ用のページはこちら</a> </noscript> <script type="text/javascript"> <!--
var UA=navigator.userAgent;
if(UA.indexOf("Mozilla/2") != -1 || UA.indexOf("Mozilla/3") != -1) {location.href = "Old.html"} if(UA.indexOf("MSIE") == -1 && UA.indexOf("Mozilla/4") != -1) {location.href = "NN4.html"} if(UA.indexOf("Netscape6/") != -1 || UA.indexOf("Netscape/7") != -1 || UA.indexOf("Netscape/8") != -1){location.href = "NN6_7_8.html"} if(UA.indexOf("Mozilla/5") != -1 && UA.indexOf("Netscape")== -1 && UA.indexOf("Safari") == -1) {location.href = "Moz_Fire.html"} if (UA.indexOf("MSIE 4") != -1){location.href = "IE4.html"} if(UA.indexOf("MSIE 5") != -1 && UA.indexOf("Opera") == -1 || (UA.indexOf('MSIE 6') != -1 && UA.indexOf('SV1') == -1 && UA.indexOf('Opera') == -1)){location.href= "IE6_5.html"} if(UA.indexOf("MSIE 6") != -1 && UA.indexOf("SV1") != -1) {location.href = "IE6_SP2.html"} if (UA.indexOf("Safari") != -1){location.href = "Safari.html"} if (UA.indexOf("Opera") != -1){location.href = "Opera.html"} //-->
</script> <style type="text/css"> </body></html>

 サンプルでは、25行目~38行目の<script type="text/javascript">~</script>にスクリプトを設定しています。このサンプルでも前のサンプルと同様、イベントハンドラを使って関数を呼び出すようにすると、古いブラウザでは機能しない場合があるため、今回も、body要素の一番最後にスクリプトを設定しています。それでは、スクリプトを見ていきましょう。

 Sample_1.htmlの「ブラウザの種類をフォームに書き出す」では、if文を入れ子にしていくことによって、ブラウザを判断していました。今回のサンプルでは少し方法を変えて、論理演算子のOR演算子「||」やAND演算子「&&」を使って、ブラウザを判断しています。論理演算子に関しては、第2回『JavaScriptを使ってクライアントのOSに応じた処理を行う』で解説していますので、併せて参照してください。

 Sample_1と同様Sample_2でも、27行目「var UA=navigator.userAgent;」でユーザエージェントの値を、変数UAに代入しています。そして、実際のブラウザの振り分け処理は、28行目~37行目になります。

Sample_2.html 28行目~37行目(抜粋)
if(UA.indexOf("Mozilla/2") != -1 || UA.indexOf("Mozilla/3") != -1)
    {location.href = "Old.html"}
if(UA.indexOf("MSIE") == -1 && UA.indexOf("Mozilla/4") != -1)
    {location.href = "NN4.html"}
if(UA.indexOf("Netscape6/") != -1 || UA.indexOf("Netscape/7") != -1
    || UA.indexOf("Netscape/8") != -1){location.href = "NN6_7_8.html"}
if(UA.indexOf("Mozilla/5") != -1 && UA.indexOf("Netscape")== -1 
    && UA.indexOf("Safari") == -1)
    {location.href = "Moz_Fire.html"}
if (UA.indexOf("MSIE 4") != -1){location.href = "IE4.html"}
if(UA.indexOf("MSIE 5") != -1 && UA.indexOf("Opera") == -1 ||
    (UA.indexOf('MSIE 6') != -1 && UA.indexOf('SV1') == -1 
    && UA.indexOf('Opera') == -1)){location.href= "IE6_5.html"}
if(UA.indexOf("MSIE 6") != -1 && UA.indexOf("SV1") != -1)
    {location.href = "IE6_SP2.html"}
if (UA.indexOf("Safari") != -1){location.href = "Safari.html"}
if (UA.indexOf("Opera") != -1){location.href = "Opera.html"}

 このスクリプトを、バージョン3か2のNetscape NavigatorやInternet Explorer 3で実行した場合、これらのブラウザは、ユーザエージェント内に、「Mozilla/2」か「Mozilla/3」の文字列が含まれているので、28行目のif文の条件式「UA.indexOf("Mozilla/2") != -1 || UA.indexOf("Mozilla/3") != -1」が真となります。続くif文の処理で、locationオブジェクトのhrefプロパティに「Old.html」の値を設定するため、HTMLファイル「Old.html」がブラウザに読み込まれます。

 この他のブラウザも同様に、それぞれ振り分けるブラウザが持つユーザエージェントを判断し、それぞれのブラウザ用に用意したページへと振り分けていきます。

 例えば、MozillaかFirefox用のページへの振り分けの判断は、ユーザエージェントに「Mozilla/5」と「Netscape」という文字列が含まれていて、さらに「Safari」という文字列が含まれていないブラウザとなるので、31行目にある条件式、「UA.indexOf("Mozilla/5") != -1 && UA.indexOf("Netscape") == -1 && UA.indexOf("Safari") == -1」となります。

 Internet Explorer 5か、SP2でないInternet Explorer 6であるかの判定は、ユーザエージェント内に「MSIE 5」という文字列が含まれていて、かつ「Opera」という文字列が含まれていないか、あるいは、文字列「MSIE 6」が含まれていて、かつ「SV1」「Opera」という文字列が含まれていないか、という条件で判定します。33行目の「UA.indexOf("MSIE 5") != -1 && UA.indexOf("Opera") == -1 || (UA.indexOf('MSIE 6') != -1 && UA.indexOf('SV1') == -1 && UA.indexOf('Opera') == -1)」という記述が該当します。

 今回のサンプルでは、ブラウザ振り分けのスクリプト以外にも、22行目~24行目でnoscript要素を使って、JavaScriptに対応していないブラウザを使っていたり、JavaScriptの実行を止めているユーザーのためのリンクを作っています。

Sample_2.html 22行目~24行目(抜粋)
<noscript>
<a href="No_Script.html">JavaScript未対応ブラウザ用のページはこちら</a>
</noscript>

 また、「ブラウザ判別中...」という文字も、16行目~20行目でJavaScriptを使って書き出すことによって、JavaScriptに対応していないブラウザでは、表示しないようにしています。

Sample_2.html 16行目~20行目(抜粋)
<script type="text/javascript">
<!--
document.write("ブラウザ判別中...");
//-->
</script>

 クロスブラウザスクリプトのサイトを作る場合、JavaScriptだけに気を配るのではなく、JavaScriptを実行できない、あるいはJavaScriptを実行しない環境のユーザーにも配慮したサイト作りを心がけることが必要です。

まとめ

 今回は、ブラウザの種類やバージョンを判断するスクリプトを紹介し、解説しました。次回も、今回に引き続き、ブラウザにおけるJavaScriptの実装の違いを吸収するために、ブラウザの種類を判断し、それに合わせたスクリプトを作る例を紹介していきたいと思います。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
クロスブラウザスクリプトの作成テクニック連載記事一覧

もっと読む

この記事の著者

半場 方人(ハンバ マサヒト)

Netscape2.XでJavaScriptに初めて出合ったころ、「なぜJavaScriptの日本語の書籍が無いんだ」、とあちこちで嘆いていたら、じゃあおまえが書け、とお声がかかり、JavaScript関連の書籍を執筆するようになる。執筆に際していつも考えるのは、「JavaScript初心者だった頃の気持ちを忘れないよに」、ということ。主な著書は、「標準Webデザイン講座 JavaScript&Ajax」(翔泳社)などがある。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/427 2010/01/05 11:02

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー