時々使用するブラウザの判定、毎回調べているのでメモ。
「UserAgent での判定」、「サポートしている機能での判定」、「使いたい機能が機能するかでの判定」などがあるので用途に合わせて利用。
UserAgent の文字列からブラウザを判定する方法。バージョンが新しくなったりすると UserAgent の値も変更されるようでこれがどのぐらい使えるかは不明(確実性に疑問)。
UserAgent と そのバージョン等は以下で取得できる。
//ユーザエージェント var userAgent = window.navigator.userAgent; //バージョン var appVersion = window.navigator.appVersion; //名前 var appName = window.navigator.appName; //プラットフォームのタイプ var platform = window.navigator.platform; //コード名 var appCodeName = window.navigator.appCodeName;
以下は Windows のChrome での例
ユーザエージェント
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36
バージョン
5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36
名前
Netscape
プラットフォームのタイプ
Win32
コード名
Mozilla
現時点でのブラウザごとのユーザエージェントの値(例)
IE(バージョン 11.0.9600.17041)
Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; Media Center PC 6.0; MASA; McAfee; rv:11.0) like Gecko
(msie は含まれていない)
Chrome(バージョン 34.0.1847.116 m)
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36
Firefox(バージョン 28.0)
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0
Safari(バージョン 5.1.7 (7534.57.2) )
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2
Opera(バージョン 20.0.1387.91)
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36 OPR/20.0.1387.91
(Opera は含まれていない)
UserAgent で判定して処理を行う例(確実性が劣ると思うので、あまり使えないかも)
//UserAgent で判定
var userAgent = window.navigator.userAgent.toLowerCase();
var appVersion = window.navigator.appVersion.toLowerCase();
if (userAgent.indexOf('msie') != -1) {
//IE6~9(おそらく)
if (appVersion.indexOf("msie 6.") != -1) {
//IE6での処理
}else if (appVersion.indexOf("msie 7.") != -1) {
//IE7での処理
}else if (appVersion.indexOf("msie 8.") != -1) {
//IE8での処理
}else if (appVersion.indexOf("msie 9.") != -1) {
//IE9での処理
}
}else if (userAgent.indexOf('chrome') != -1) {
//Chrome/Opera(最新版)での処理
}else if (userAgent.indexOf('safari') != -1) {
//Safariでの処理
}else if (userAgent.indexOf('firefox') != -1) {
//Firefoxでの処理
}
使用例
ブラウザが、クローム、サファリ、オペラの場合は true を返す関数を作成する例
function is_chromeSafariOpeara() {
var ua = navigator.userAgent.toLowerCase();
if (ua.indexOf('chrome') != -1 || ua.indexOf('safari') != -1 || ua.indexOf('opera') != -1) {
return true;
}
}
//作成した関数を利用
if(is_chromeSafariOpeara()) {
$('#elem').css({...});
}
UserAgent の文字列から OS を判定する例(確実性は不明)
if(navigator.userAgent.toLowerCase().indexOf('win') != -1){
// Windowsでの処理
}else if(navigator.userAgent.toLowerCase().indexOf('mac') != -1) {
// Macでの処理
}
ブラウザがサポートしている機能でブラウザを判定する方法。こちらの方が確実性が高いと思う。但し、「IE10以上での処理」の部分は?。 IE11 で試したところ「IE9」と表示された。
参考にさせていただいたサイト:
「JavaScript ユーザエージェント条件分岐便利スニペット(w3g.jp)」
jQuery(function($){
//ユーザエージェント条件分岐便利スニペット
var _ua = (function(){
return {
ltIE6:typeof window.addEventListener == "undefined" && typeof document.documentElement.style.maxHeight == "undefined",
ltIE7:typeof window.addEventListener == "undefined" && typeof document.querySelectorAll == "undefined",
ltIE8:typeof window.addEventListener == "undefined" && typeof document.getElementsByClassName == "undefined",
ltIE9:document.uniqueID && typeof window.matchMedia == "undefined",
gtIE10:document.uniqueID && window.matchMedia,
Trident:document.uniqueID,
Gecko:'MozAppearance' in document.documentElement.style,
Presto:window.opera,
Blink:window.chrome,
Webkit:typeof window.chrome == "undefined" && 'WebkitAppearance' in document.documentElement.style,
Touch:typeof document.ontouchstart != "undefined",
Mobile:typeof window.orientation != "undefined",
ltAd4_4:typeof window.orientation != "undefined" && typeof(EventSource) == "undefined",
Pointer:window.navigator.pointerEnabled,
MSPoniter:window.navigator.msPointerEnabled
}
})();
/* 以下は用途に合わせて必要な部分のみを使えばよいと思う */
if(_ua.ltIE6){
//document.write('IE6以下');
//IE6以下での処理
}else if(_ua.ltIE7){
//document.write('IE7以下');
//IE7以下での処理
}else if(_ua.ltIE8){
//document.write('IE8以下');
//IE8以下での処理
}else if(_ua.Trident && !_ua.ltIE8){
//document.write('IE9');
//IE9での処理
}else if( (_ua.Trident && !_ua.ltIE9 ) || _ua.gtIE10){
//document.write('IE10以上');
//IE10以上での処理★ IE11 で試したところ「IE9」と表示される
}else if(_ua.Blink && !_ua.Mobile){
//document.write('デスクトップ版Chrome/Opera');
//デスクトップ版Chrome/Operaでの処理
}else if(_ua.Blink && _ua.Mobile){
//document.write('Chrome for Android');
//Chrome for Androidでの処理
if(_ua.ltAd4_4){
//document.write(':バージョンはAndroid4.4未満');
//Chrome for Android(バージョン Android4.4未満)での処理
}
}else if(_ua.Webkit && !_ua.Mobile){
//デスクトップ版Safariでの処理
//document.write('デスクトップ版Safari');
}else if(_ua.Webkit && _ua.Mobile){
//document.write('モバイルでWebkitベース');
//モバイルでWebkitベースでの処理
if(_ua.ltAd4_4){
//document.write(':バージョンはAndroid4.4未満');
//モバイルでWebkitベース(バージョン Android4.4未満)での処理
}
}else if(_ua.Gecko && !_ua.Mobile){
//document.write('デスクトップ版Firefox');
//デスクトップ版Firefoxでの処理
}else if(_ua.Gecko && _ua.Mobile){
//document.write('モバイル版Firefox');
//モバイル版Firefoxでの処理
}else if(_ua.Presto){
//document.write('旧Presto OperaまたはOpera Mini');
//旧Presto OperaまたはOpera Miniでの処理
}
});
上記スニペットを利用した例。
IE7、IE8 ではアイコンフォントが使用できないため処理を分岐する例。
var close_link;
//Modern Browser, IE9 +
if(!_ua.ltIE8){
close_link = '<button type="button" class="close"><span class="glyphicon glyphicon-remove-circle"></span></button>';
}else{
//IE7、IE8
if($('body').hasClass('jp')) {
close_link = '<a href="#" class="close_link">( x 閉じる)</a>';
}else{
close_link = '<a href="#" class="close_link">( x close)</a>';
}
}
参考にさせていただいたサイト:
「jQuery 1.9 で $.browser が使えなくなってしまった対策(cyokodog.net)」
例えばスムーススクロールを実装する場合、ブラウザが webkit かどうかではなく、スクロールさせることができる要素が html か body かがわかればいいので、実際にどちらの要素がスクロールするかを試して判定する。
//スムーズスクロールの例
var isHtmlScrollable = (function(){
var html = $('html'), top = html.scrollTop();
var elm = $('<div/>').height(10000).prependTo('body');
html.scrollTop(10000);
var rs = !!html.scrollTop();
html.scrollTop(top);
elm.remove();
return rs;
})();
$('a[href^=#]').click(function(){
$(isHtmlScrollable ? 'html' : 'body').animate({
scrollTop: 0
}, 300);
return false;
});
関連ページ:「ページ内リンクへアニメーションで移動」
position:fixed が有効かどうかを判定する例
var isPositionFixedEnable = (function(){
var el = $('<div/>').add('<div/>').css({height:8,position:'fixed',top:0}).prependTo('body');
var rs = el.eq(0).offset().top == el.eq(1).offset().top;
el.remove();
return rs;
})();