jQuery.supportでのブラウザ判別
Updated / Published
下記に記載の内容は情報が古くなったために正しく動作しなくなりました。JSでのUA条件分岐便利スニペットとして、代替案を提示しています。jQueryでブラウザを判別するjQuery.browser
のAPIは1.3より非推奨のため、代わりにブラウザがサポートする機能を判別するAPIであるjQuery.support
で代表的なブラウザの判別方法をまとめてみました。これならUser Agentが偽装されても大丈夫、UA情報には依存しないサポートしている機能だけでのブラウザ判別を行う試みです。
jQuery.browserは非推奨
if(jQuery.browser.msie){
alert('あなたがお使いのブラウザはIEです');
}else if(jQuery.browser.mozilla){
alert('あなたがお使いのブラウザはFirefoxです');
}else if(jQuery.browser.webkit){
alert('あなたがお使いのブラウザはchromeもしくはsafariです');
}else if(jQuery.browser.opera){
alert('あなたがお使いのブラウザはoperaです');
}
jQuery.browser
を使えば、上記の簡単なコードだけでブラウザを判別した条件分岐が行えます。加えてバージョンの判別もjQuery.browser.version
を使ってできます。
if(jQuery.browser.msie && parseInt(jQuery.browser.version) == 8){
alert('あなたがお使いのブラウザはIE8です');
}else if(jQuery.browser.msie && parseInt(jQuery.browser.version) == 7){
alert('あなたがお使いのブラウザはIE7です');
}else if(jQuery.browser.msie && parseInt(jQuery.browser.version) == 6){
alert('あなたがお使いのブラウザはIE6です');
}
jQuery.browser
とjQuery.browser.version
はすごく便利ですが、jQuery1.3からはどちらも非推奨となっています。1.3以降のバージョンでは後方互換とプラグイン利用のためにまだ含まれていますが、今後のjQueryのバージョンアップに伴い、この機能は廃止される見通しです。また、飽くまでもこれらはnavigator.userAgent
の値をもとにしており、UA情報は簡単に偽装することもできます。そこで、代わりにブラウザがサポートする機能に基づいて判別を行うjQuery.support
を使うことが推奨されています。
jQuery.supportについて
jQuery.support
は、ブラウザごとの各機能のサポート状態をBoolean型の true
or false
の値で返すAPIです。各機能にあたるプロパティには次のようなものがあります。
leadingWhitespace
innerHTML
で、先頭に空白があった場合にそれを残して返すブラウザであればtrue
です。tbody
table
要素内に、tbody
要素が無い状態を許可する(省略時に自動的に付加しない)ブラウザであればtrue
です。htmlSerialize
innerHTML
を用いた際に、シリアライズされた値を返すブラウザであればtrue
です。style
getAttribute("style")
で要素に記述されたstyle
属性値を取得できるブラウザであればtrue
です。hrefNormalized
href
属性の値を取得する際に、属性値をそのまま返す(勝手に補完しない)ブラウザであればtrue
です。opacity
opacity
による透明度を指定する機能を実装しているブラウザであればtrue
です。cssFloat
float
の値を取得する場合にstyle.cssFloat
で取得できるブラウザであればtrue
です。checkOn
- チェックボックスの値が指定されていない場合のデフォルト値が"on"であるブラウザであれば
true
です(webkitはデフォルト値が""の空なので、false
です)。 deleteExpando
- 拡張した要素の属性を、
delete
演算子で削除できるブラウザであればtrue
です。 checkClone
cloneNode()
を使用して要素を複製する場合に要素のチェック状態も含めコピーできるブラウザでればtrue
です。scriptEval
appendChild()
やcreateTextNode()
で要素を追加した際、そこにスクリプトが含まれていると、それを自動的に実行できるブラウザであればtrue
です。noCloneEvent
- 要素がコピーされる場合に、元の要素がもっていたイベントハンドラをコピーしないブラウザであれば
true
です。 boxModel
- W3C CSS Box Model に基づいてページをレンダリングしているブラウザであれば
true
です。
これらのプロパティのブラウザ毎の値を一覧表にまとめると、次の通りです。
プロパティ名 | Chrome 5+ | Safari 5+ | Firefox 3.6+ | Opera 10.5+ | IE6 | IE7 | IE8 | IE9 |
---|---|---|---|---|---|---|---|---|
leadingWhitespace | true | true | true | true | false | false | false | true |
tbody | true | true | true | true | false | false | true | true |
htmlSerialize | true | true | true | true | false | false | false | true |
style | true | true | true | true | false | false | true | true |
hrefNormalized | true | true | true | true | false | false | true | true |
opacity | true | true | true | true | false | false | false | true |
cssFloat | true | true | true | true | false | false | false | true |
checkOn | false | false | true | true | true | true | true | true |
deleteExpando | true | true | true | true | false | false | false | true |
checkClone | true | true | true | true | true | true | true | true |
scriptEval | true | true | true | true | false | false | false | true |
noCloneEvent | true | true | true | true | false | false | false | false |
boxModel | true | true | true | true | true | true | true | true |
submitBubbles | true | true | true | true | false | false | false | true |
changeBubbles | true | true | true | true | false | false | false | true |
chromeとsafariを対象とする場合
if(!jQuery.support.checkOn){
alert('あなたがお使いのブラウザはChromeもしくはSafariっぽいです');
}
if文の条件式の中で!
をつけたので、checkOn
がfalse
であればこの条件文に該当します。該当するのはwebkitだけなので、これでchormeとsafariのみに振り分けたコードを記述できます。なお、Android標準ブラウザ、iPhone / iPad標準ブラウザといったスマートフォンも同じChromeとSafariなので、この条件に合致します。
FirefoxとOperaを対象とする場合
if(jQuery.support.checkOn && jQuery.support.noCloneEvent){
alert('あなたがお使いのブラウザはFirefoxもしくはOperaっぽいです');
}
まず、checkOn
がtrue
条件なので、chromeとsafariがこれにはじかれ、IEの全バージョンでfalse
が返るnoCloneEvent
をand条件に加えることで、FirefoxかOperaのみに振り分けたコードを記述できます。さらにここから、FirefoxかOperaかを判別するには、jQueryではなく、window.globalStorage
を使います。globalStorage
を使うのはFirefoxのみです。ただし、問題があります。globalStorage
がWeb Storageの仕様自体から削除されたため、今後FirefoxのアップデートによってglobalStorage
自体が削除されると、以下のOperaとFirefoxの判別は今後通用しなくなるかもしれませんということで注意してください。一応、Firefox4 betaではglobalStorage
自体は残されていたので問題なく動作確認できています。
if(jQuery.support.checkOn && jQuery.support.noCloneEvent && window.globalStorage){
alert('あなたがお使いのブラウザはFirefoxっぽいです');
}else if(jQuery.support.checkOn && jQuery.support.noCloneEvent && !window.globalStorage){
alert('あなたがお使いのブラウザはOperaっぽいです');
}
IEのみを対象として各バージョンでの振り分けもできるようにしたい場合
ブラウザ判別でのコード分岐は特にIEにおいて活躍することが多いので、いろいろなアプローチを取り上げてみます。
IE9を除く、IE6,7,8を対象にしたい場合
if(!jQuery.support.opacity){
alert('あなたがお使いのブラウザはIE6,7,8っぽいのいずれかです');
}
IE9からはopacity
をサポートしているので、これをサポートしていない(false
が返る)のはIE6,7,8だけです。IE6,7,8に対してのみまとめて書きたい場合に使えます。特にIE9は他のモダンブラウザと並ぶくらいサポートが良化してきているので、IE9を除くIE6,7,8にだけという場面は今後も頻発するかと思います。
IE6,7,8の各バージョン判別もできるようにしたい場合
if(!jQuery.support.opacity){
if(!jQuery.support.style){
alert('あなたがお使いのブラウザはIE6,7っぽいのどちらかです');
}else{
alert('あなたがお使いのブラウザはIE8っぽいです');
}
}
style
はIE8からサポートしているのでIE6,7とIE8を切り分けることができます。しかし、IE6とIE7の切り分けがまだできていません。IE6とIE7をブラウザのサポート状態だけで切り分けるには、こちらもjQueryではなくtypeof document.documentElement.style.maxHeight != "undefined"
を利用します。これはmaxHeight
プロパティをサポートしているかどうかで判別します。なお、IE8の互換表示モード時はIE7の部分が通ります。
if(!jQuery.support.opacity){
if(!jQuery.support.style){
if (typeof document.documentElement.style.maxHeight != "undefined") {
alert('あなたがお使いのブラウザはIE7っぽいです');
}
else {
alert('あなたがお使いのブラウザはIE6っぽいです');
}
}else{
alert('あなたがお使いのブラウザはIE8っぽいです');
}
}
IE9のみを対象にしたい場合
if(!jQuery.support.noCloneEvent && jQuery.support.opacity){
alert('あなたがお使いのブラウザはIE9っぽいです');
}
noCloneEvent
がfalse
なのはIEだけなので、まずIEのみに対象を絞り込むことができ、IE6,7,8,9の中でopacity
がtrue
なのはIE9だけなので、IE6,7,8を除いたIE9のみの条件分岐が可能です。
自分のブラウザを判別してみよう!
if(!jQuery.support.checkOn && jQuery.support.checkClone){
document.write('あなたがお使いのブラウザはchromeもしくはsafariっぽいです');
}else if(jQuery.support.checkOn && jQuery.support.noCloneEvent && window.globalStorage){
document.write('あなたがお使いのブラウザはFirefoxっぽいです');
}else if(jQuery.support.checkOn && jQuery.support.noCloneEvente && !window.globalStorage){
document.write('あなたがお使いのブラウザはOperaっぽいです');
}else if(!jQuery.support.noCloneEvent && jQuery.support.opacity){
document.write('あなたがお使いのブラウザはIE9っぽいです');
}else if(!jQuery.support.opacity){
if(!jQuery.support.style){
if (typeof document.documentElement.style.maxHeight != "undefined") {
document.write('あなたがお使いのブラウザはIE7っぽいです');
} else {
document.write('あなたがお使いのブラウザはIE6っぽいです');
}
}else{
document.write('あなたがお使いのブラウザはIE8っぽいです');
}
}else{
document.write('ごめんなさい、あなたのブラウザを特定できませんでした');
}
以上、jQuery.support
に加えて、機能をサポートしているかどうかの条件文にのみこだわったブラウザの判別でした。IEの判別はまあまあ使えるでしょうか。それ以外のブラウザはサポートしている機能が同じなので、条件分岐させる必要もないことでしょう。