jQueryのブラウザ判別プラグイン
以下のサイトで、jQueryプラグインで、UserAgentを判別する機能が提供されている。
http://tenderfeel.xsrv.jp/jquery/1176/jquery/1174/
インターフェイスがシンプルなので是非使いたいと思ったが、なぜかiPad、iPhoneで動いてくれない。でも他のブラウザでは動作しているように見える。初めてこのプラグインに出会ったときは「中途半端な出来なのかな(失礼)」と思い、使用を諦めたのだけれど、$.browserに値が組み込まれるというシンプルで美しい実装に心ひかれて、どうしても使いたくなった。
少なくとも「navigator.userAgent.indexOf」と書くよりは見栄えがいいと思って。
ちなみに配布されている状態では以下のようなエラーが出る(iPadで)。
TypeError: ‘null’ is not an object
「これって当たり前でしょ」ってエラー(nullがオブジェクトなわけがない)。検討してみてiOSで動かないことがわかった。でもiOSでも動作するような実装になっている。とくれば、きっと内部コードにあるiOSの場合のみ起動する部分があるはず。ということでコードを追うことにした。
でも分岐処理がわかりやすくて、コードもシンプルで、一目見て原因がわかった。UserAgentを抜き出すための正規表現の問題だ。iOS5になってUserAgentの書式が変更されたことで、本来配列として返される変数がnullになってしまっていたようだ。
112行目あたりを変更して動作した。
//var m = ua.match(/\((\w+); U;[\w\s]+? OS (\d_\d(?:_\d)*)/i);
var m = ua.match(/\((\w+); [U;]?[\w\s]+? OS (\d_\d(?:_\d)*)/i);
スマホ系に特化したUserAgentも動作しなかったので、おそらく似たような修正で動くんじゃなかろうか。
綺麗なプログラムを公開なさっている作者に感謝。