第74回 「MacOS XのブラウザSafariのバージョンを判別(1)」


 今回はMacOS XのブラウザSafariのバージョンを判別するプログラムを作成します。
 SafariはMacOS Xでの標準ブラウザになるのですが、他のブラウザと比べてやっかいな状態になっています。多くの場合に判別するブラウザは

・Internet Explorer
・Netscape Navigator

ですが、ここにSafariが入ってくる事になります。Safariがやっかいなのは以下のuserAgentの文字列を見てみると分かります。

●MacOS X 10.2のもの
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.6

●MacOS X 10.3のもの
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/103u (KHTML, like Gecko) Safari/100.1

 実際にはSafari/85だったり細かいバージョンがいくつか存在します。困るのはGeckoという文字が入っている事です。なぜ困るかと言うと、この文字がGeckoエンジンを利用したブラウザ、代表的なものとしてはNetscape 6以降、Mozillaなどがあります。これらは同じエンジンを利用しているので、ほぼ同じようにレイアウトされます。(HTML,CSSなどの解釈が同じ)
 Netscape 6以降かどうかは、このGeckoの文字列で判別する事が多いため、間違ってSafariもNetscapeと判別されてしまいます。このため、ブラウザを判別する場合には

(1) Safari
(2) Netscape

 の順番で処理しなければなりません。この順番でブラウザを判別したらSafariのバージョンを抜き出す作業に入ります。
 Safariの場合にはuserAgent以外にもappVersionにバージョンが表記されています。

5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/103u (KHTML, like Gecko) Safari/100.1

 文字列の最後の/以降がバージョンになります。と書きたい所なのですが、Safariのバージョンは


・MacOS X 10.2のもの(v85.x)がバージョン1.0
・MacOS X 10.3のもの(v100.x)がバージョン1.1

 となっています。つまりuserAgentに書かれているバージョンと名目上のバージョンが異なっているのです。どこから、どの範囲がどのバージョンになるのかはApple Computer次第という何とも困った状態になっています。
 今回はuserAgent内のバージョン(v85やv100)のみを抜き出してみることにします。
 文字列の最後からみて/がある次の文字列以降がバージョンになるのでlastIndexOf()を使って文字列の最後から検索を行います。/の次の文字から一番最後までを抜き出します。最後の位置は文字列の長さになりますのでlengthを使って取得することができます。実際のプログラムは以下のようになります。


<html>
<head>
<title></title>
<script language="JavaScript"><!--
// Safariのバージョンを返します
function getVersion()
{
var uName = navigator.userAgent;
sPtr = uName.lastIndexOf("/");
ePtr = uName.length;
ver = uName.substring(sPtr+1,ePtr);
return eval(ver);
}
// --></script>
</head>
<body>
<form>
<input type="button" value="チェック" onClick="alert(getVersion())">
</form>
</body>
</html>


 また、split()を使って判別すると非常に簡単になります。これは以下のようになります。

<html>
<head>
<title></title>
<script language="JavaScript"><!--
// Safariのバージョンを返します
function getVersion()
{
var uName = navigator.userAgent;
ver = uName.split("/")[3];
return eval(ver);
}
// --></script>
</head>
<body>
<form>
<input type="button" value="チェック" onClick="alert(getVersion())">
</form>
</body>
</html>


 次回はv85.xだったら1.0、v100.xだったら1.1を返すプログラムについて説明します。







2002-2004 Copyright KaZuhiro FuRuhata (古籏一浩)