時々使用するブラウザの判定、毎回調べているのでメモ。
「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;
- })();