web-dev-qa-db-ja.com

モバイルデバイスを検出するための最良の方法は何ですか?

ユーザーがjQueryでモバイルデバイスを使用しているかどうかを検出するための確実な方法はありますか? CSSの@media属性に似たものはありますか?ブラウザがハンドヘルドデバイス上にある場合は、別のスクリプトを実行したいと思います。

JQueryの$.browser関数は私が探しているものではありません。

1481
superUntitled

JQueryを使う代わりに、簡単なJavaScriptを使って検出することができます。

if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
 // some code..
}

あるいは、jQueryを使ってアクセスしやすくするために、両方を組み合わせることもできます。

$.browser.device = (/Android|webos|iphone|ipad|iPod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase()));

$.browserは、上記のすべてのデバイスに対して"device"を返すようになりました

注:$.browser jQuery v1.9.1 から削除されました。しかし、あなたはjQueryの移行プラグインを使用することでこれを使用することができます コード


より徹底的なバージョン:

var isMobile = false; //initiate as false
// device detection
if(/(Android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|Kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|Palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent) 
    || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0,4))) { 
    isMobile = true;
}
1838

私にとって小さいのは美しいので、私はこのテクニックを使っています:

CSSファイルでは:

/* Smartphones ----------- */
@media only screen and (max-width: 760px) {
  #some-element { display: none; }
}

JQuery/JavaScriptファイルでは、 

$( document ).ready(function() {      
    var is_mobile = false;

    if( $('#some-element').css('display')=='none') {
        is_mobile = true;       
    }

    // now i can use is_mobile to run javascript conditionally

    if (is_mobile == true) {
        //Conditional script here
    }
 });

私の目的は私のサイトを "モバイルフレンドリー"にすることでした。そのため、私はCSS Media Queriesを使用して、画面サイズに応じて要素を表示/非表示にします。

たとえば、私のモバイル版では、Facebook Like Boxをアクティブにしたくありません。これらのプロフィール画像やものがすべて読み込まれるからです。そしてそれはモバイル訪問者には良くありません。そのため、コンテナ要素を非表示にするだけでなく、jQueryコードブロック(上記)の内部でもこれを行います。

if(!is_mobile) {
    (function(d, s, id) {
        var js, fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) return;
        js = d.createElement(s); js.id = id;
        js.src = "//connect.facebook.net/pt_PT/all.js#xfbml=1&appId=210731252294735";
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
}

あなたは http://lisboaautentica.com で実際にそれを見ることができます

私はまだモバイル版に取り組んでいるので、これを書いている時点では、まだそれがあるべき姿に見えていません。

dekin88による更新

メディアを検出するために組み込まれたJavaScript APIがあります。上記の解決策を使用するのではなく、単に以下を使用してください。

$( document ).ready(function() {      
    var isMobile = window.matchMedia("only screen and (max-width: 760px)").matches;

    if (isMobile) {
        //Conditional script here
    }
 });

ブラウザのサポート: http://caniuse.com/#feat=matchmedia

この方法の利点は、シンプルで短いだけでなく、必要に応じてDOMにダミー要素を追加することなく、スマートフォンやタブレットなどのさまざまなデバイスを個別に条件付きでターゲティングできることです。

450
Gonçalo Peres

Mozillaによると - ユーザーエージェントを使用してブラウザの検出

まとめると、モバイルデバイスを検出するには、ユーザーエージェントのどこかで文字列“ Mobi”を探すことをお勧めします。

このような:

if (/Mobi/.test(navigator.userAgent)) {
    // mobile!
}

これは、モバイルMozilla、Safari、IE、Opera、Chromeなどを含むすべての一般的なモバイルブラウザユーザーエージェントと一致します。

Android用アップデート

EricLでは、 Chromeユーザーエージェント文字列 のタブレット用の/には "Mobi"が含まれていないため、ユーザーエージェントとしてもAndroidをテストすることをお勧めします(ただし、電話バージョンには含まれます)。

if (/Mobi|Android/i.test(navigator.userAgent)) {
    // mobile!
}
202
QuasarDonkey

シンプルで効果的なワンライナー:

function isMobile() { return ('ontouchstart' in document.documentElement); }

ただし、上記のコードでは、タッチスクリーン付きのラップトップの場合は考慮されていません。したがって、 @ Julian solution に基づいて、この2番目のバージョンを提供します。

function isMobile() {
  try{ document.createEvent("TouchEvent"); return true; }
  catch(e){ return false; }
}
82
sequielo

あなたがモバイルデバイスを検出したいということによってしていることは、「ブラウザスニッフィング」という概念IMOに少し近づきすぎています。何らかの機能検出を行う方がはるかによいでしょう。 http://www.modernizr.com/ のようなライブラリはそれを手助けすることができます。

たとえば、モバイルとモバイル以外の境界線はどこですか。毎日ますますぼやけています。

77
Bart

それはjQueryではありませんが、私はこれを見つけました: http://detectmobilebrowser.com/ /

それはいくつかの言語でモバイルブラウザを検出するためのスクリプトを提供します。そのうちの1つはJavaScriptです。それはあなたが探しているものを手助けするかもしれません。

ただし、jQueryを使用しているので、jQuery.supportコレクションに注意する必要があります。現在のブラウザの機能を検出するためのプロパティの集まりです。ドキュメントはこちら: http://api.jquery.com/jQuery.support/

私があなたが何を達成しようとしているのか正確にはわからないので、私はこれらのどれが最も役に立つのかわかりません。

言われていることをすべて、私はあなたの最善の策はサーバー側の言語を使用して出力に別のスクリプトをリダイレクトするか書くことです(それがオプションであるなら)。あなたはモバイルブラウザxの機能を実際には知らないので、サーバ側で検出と変更ロジックを行うことが最も信頼できる方法でしょう。もちろん、サーバーサイドの言語を使えないのであれば、これらすべてが重要なポイントになります。

62
Ender

IPhoneストアやAndroidマーケットへのリンクのように、クライアントがどのブランドのデバイスを使用しているのかを知りたい場合があります。 Modernizerは素晴らしいですが、HTML5やFlashなどのブラウザ機能のみを表示します。

これはjQueryの私のUserAgentソリューションで、各デバイスタイプに異なるクラスを表示するものです。

/*** sniff the UA of the client and show hidden div's for that device ***/
var customizeForDevice = function(){
    var ua = navigator.userAgent;
    var checker = {
      iphone: ua.match(/(iPhone|iPod|iPad)/),
      blackberry: ua.match(/BlackBerry/),
      Android: ua.match(/Android/)
    };
    if (checker.Android){
        $('.Android-only').show();
    }
    else if (checker.iphone){
        $('.idevice-only').show();
    }
    else if (checker.blackberry){
        $('.berry-only').show();
    }
    else {
        $('.unknown-device').show();
    }
}

この解決策はGraphics Maniacs http://graphicmaniacs.com/note/detecting-iphone-iPod-ipad-Android-and-blackberry-browser-with-javascript-and-php/ からのものです

46
genkilabs

で解決策を見つけた: http://www.abeautifulsite.net/blog/2011/11/detecting-mobile-devices-with-javascript/

var isMobile = {
    Android: function() {
        return navigator.userAgent.match(/Android/i);
    },
    BlackBerry: function() {
        return navigator.userAgent.match(/BlackBerry/i);
    },
    iOS: function() {
        return navigator.userAgent.match(/iPhone|iPad|iPod/i);
    },
    Opera: function() {
        return navigator.userAgent.match(/Opera Mini/i);
    },
    Windows: function() {
        return navigator.userAgent.match(/IEMobile/i);
    },
    any: function() {
        return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
    }
};

そして、それがモバイルかどうかを確認するために、次のものを使ってテストすることができます。 

if(isMobile.any()) {
   //some code...
}
42
Gabriel

「モバイル」とは「小さい画面」を意味します。私はこれを使用します。

var windowWidth = window.screen.width < window.outerWidth ?
                  window.screen.width : window.outerWidth;
var mobile = windowWidth < 500;

IPhoneではwindow.screen.widthが320になります。Androidではwindow.screenWidthが480になります(ただしAndroidによって異なります)。 iPadやAndroidのタブレットは768のような数字を返すので、望みどおりの全体像が得られます。

22
Chris Moschini

Modernizr を使用する場合、前述のようにModernizr.touchを使用するのはとても簡単です。

ただし、安全のため、Modernizr.touchとユーザーエージェントのテストを組み合わせて使用​​することをお勧めします。

var deviceAgent = navigator.userAgent.toLowerCase();

var isTouchDevice = Modernizr.touch || 
(deviceAgent.match(/(iphone|iPod|ipad)/) ||
deviceAgent.match(/(Android)/)  || 
deviceAgent.match(/(iemobile)/) || 
deviceAgent.match(/iphone/i) || 
deviceAgent.match(/ipad/i) || 
deviceAgent.match(/iPod/i) || 
deviceAgent.match(/blackberry/i) || 
deviceAgent.match(/bada/i));

if (isTouchDevice) {
        //Do something touchy
    } else {
        //Can't touch this
    }

Modernizrを使用しない場合は、上記のModernizr.touch関数を単に('ontouchstart' in document.documentElement)に置き換えることができます。

また、iemobileというユーザーエージェントをテストすると、Windows Phoneよりも広範囲のMicrosoftモバイルデバイスが検出されることになります。

こちらのSOもご覧ください

15
Peter-Pan

navigator.userAgentに依存することはできません。すべてのデバイスが実際のOSを公開するわけではありません。たとえば、私のHTCでは、設定によって異なります(「モバイルバージョンを使用する」のオン/オフ)。 http://my.clockodo.com では、screen.widthを使用して小さなデバイスを検出しました。残念ながら、一部のAndroidバージョンでは、screen.widthにバグがあります。この方法とuserAgentを組み合わせることができます。

if(screen.width < 500 ||
 navigator.userAgent.match(/Android/i) ||
 navigator.userAgent.match(/webOS/i) ||
 navigator.userAgent.match(/iPhone/i) ||
 navigator.userAgent.match(/iPod/i)) {
alert("This is a mobile device");
}
14
Ben H

私はこの質問に多くの答えがあることを知っています、しかし私がこれを解決する方法を誰も答えに近づいていないのを見たものから。

CSSはwidth(Media Queries)を使用して、幅に基づいてWebドキュメントに適用されるスタイルを決定します。 JavaScriptでwidthを使わないのはなぜですか?

たとえば、Bootstrapの(Mobile First)Media Queriesには、4つのスナップ/ブレークポイントがあります。

  • 超小型デバイスは768ピクセル以下です。
  • 小型デバイスの範囲は768から991ピクセルです。
  • 中型デバイスの範囲は992から1199ピクセルです。
  • 大型デバイスは1200ピクセル以上です。

これを使用して、JavaScriptの問題も解決できます。

最初に、ウィンドウサイズを取得し、どのサイズのデバイスがアプリケーションを表示しているかを確認できる値を返す関数を作成します。

var getBrowserWidth = function(){
    if(window.innerWidth < 768){
        // Extra Small Device
        return "xs";
    } else if(window.innerWidth < 991){
        // Small Device
        return "sm"
    } else if(window.innerWidth < 1199){
        // Medium Device
        return "md"
    } else {
        // Large Device
        return "lg"
    }
};

これで関数が設定されたので、次のように呼び出して値を格納します。

var device = getBrowserWidth();

あなたの質問は

ブラウザがハンドヘルドデバイス上にある場合は、別のスクリプトを実行したいと思います。

デバイス情報が揃ったので、あとはif文です。

if(device === "xs"){
  // Enter your script for handheld devices here 
}

これはCodePenの例です: http://codepen.io/jacob-king/pen/jWEeWG

13
Jacob King

http://detectmobilebrowsers.com/ これでモバイル検出用のコードをさまざまな言語で作成することができました(ただし、これらに限定されません)。

  • アパッチ
  • ASP
  • C#
  • IIS
  • JavaScript
  • NGINX
  • PHP
  • Perl
  • Python
  • レール

タブレットも検出する必要がある場合は、追加のRegExパラメータについてAboutセクションを確認してください。

Androidタブレット、iPad、Kindle Fire、PlayBookはデザインでは検出されません。タブレットのサポートを追加するには、最初の正規表現に|Android|ipad|playbook|silkをに追加します。

11
Maksim Luzik

小型ディスプレイを特に気にしないのであれば、幅/高さの検出を使用できます。そのため、幅が一定のサイズを下回ると、モバイルサイトがスローされます。これは完璧な方法ではないかもしれませんが、複数のデバイスを検出するのがおそらく最も簡単でしょう。あなたはiPhone 4(大解像度)のために特定のものを入れる必要があるかもしれません。 

11
MoDFoX

1行のJavaScriptで:

var isMobile = ('ontouchstart' in document.documentElement && navigator.userAgent.match(/Mobi/));

ユーザーエージェントに「Mobi」(MDNに従って)が含まれていて、ontouchstartが利用可能な場合は、モバイルデバイスである可能性があります。 

11
James Westgate

私はあなたがチェックアウトすることをお勧めします http://wurfl.io/ /

一言で言えば、あなたが小さなJavaScriptファイルをインポートするならば:

<script type='text/javascript' src="//wurfl.io/wurfl.js"></script>

次のようなJSONオブジェクトが残ります。

{
 "complete_device_name":"Google Nexus 7",
 "is_mobile":true,
 "form_factor":"Tablet"
}

(もちろん、あなたがNexus 7を使っていると仮定している)そしてあなたは次のようなことができるようになるでしょう:

if(WURFL.is_mobile) {
    //dostuff();
}

これがあなたが探しているものです。

免責事項:私はこの無料サービスを提供している会社で働いています。

7
Luca Passani

さらに制御層を追加するには、HTML 5ストレージを使用して、モバイルストレージとデスクトップストレージのどちらが使用されているのかを検出します。ブラウザがストレージをサポートしていない場合、私はモバイルブラウザの名前の配列を持っていて、その配列の中のブラウザとユーザーエージェントを比較します。

とても簡単です。これが関数です:

// Used to detect whether the users browser is an mobile browser
function isMobile() {
    ///<summary>Detecting whether the browser is a mobile browser or desktop browser</summary>
    ///<returns>A boolean value indicating whether the browser is a mobile browser or not</returns>

    if (sessionStorage.desktop) // desktop storage 
        return false;
    else if (localStorage.mobile) // mobile storage
        return true;

    // alternative
    mobile = ['iphone','ipad','Android','blackberry','nokia','opera mini','windows mobile','windows phone','iemobile','tablet','mobi']; 
    var ua=navigator.userAgent.toLowerCase();
    for (var i in mobile) if (ua.indexOf(mobile[i]) > -1) return true;

    // nothing found.. assume desktop
    return false;
}
7
Rasmus Søborg

これはあなたがモバイルブラウザで動いているかどうかに関する真偽の答えを得るために使うことができる関数です。はい、それはブラウザスニッフィングです、しかし時々それはまさにあなたが必要とするものです。

function is_mobile() {
    var agents = ['Android', 'webos', 'iphone', 'ipad', 'blackberry'];
    for(i in agents) {
        if(navigator.userAgent.match('/'+agents[i]+'/i')) {
            return true;
        }
    }
    return false;
}
6
Jonathon Hill

デバイスタイプが使用されているかどうかを確認するために、次の文字列の組み合わせを使用することをお勧めします。

Mozillaのドキュメントによれば string Mobiを推奨します。しかし、古いタブレットの中には、Mobiだけが使用されているとtrueを返さないため、Tablet文字列も使用する必要があります。

同様に、安全のためにiPadiPhoneの文字列を使ってデバイスタイプをチェックすることもできます。

ほとんどの新しいデバイスは、true文字列に対してのみMobiを返します。

if (/Mobi|Tablet|iPad|iPhone/.test(navigator.userAgent)) {
    // do something
}
6
Sanjay Joshi

この post をチェックしてください。これは、タッチデバイスが検出されたときに何をすべきか、またはtouchstartイベントが呼び出されたときに何をすべきかについての本当にいいコードスニペットを提供します。

$(function(){
  if(window.Touch) {
    touch_detect.auto_detected();
  } else {
    document.ontouchstart = touch_detect.surface;
  }
}); // End loaded jQuery
var touch_detect = {
  auto_detected: function(event){
    /* add everything you want to do onLoad here (eg. activating hover controls) */
    alert('this was auto detected');
    activateTouchArea();
  },
  surface: function(event){
    /* add everything you want to do ontouchstart here (eg. drag & drop) - you can fire this in both places */
    alert('this was detected by touching');
    activateTouchArea();
  }
}; // touch_detect
function activateTouchArea(){
  /* make sure our screen doesn't scroll when we move the "touchable area" */
  var element = document.getElementById('element_id');
  element.addEventListener("touchstart", touchStart, false);
}
function touchStart(event) {
  /* modularize preventing the default behavior so we can use it again */
  event.preventDefault();
}
6
Safran Ali

すべての回答はユーザーエージェントを使用してブラウザーを検出しますが、ユーザーエージェントに基づくデバイス検出はあまり良いソリューションではありません。タッチデバイスなどの機能を検出する方が良いです(新しいjQueryでは$.browserを削除し、代わりに$.supportを使用します)。

モバイルを検出するには、タッチイベントを確認できます。

function is_touch_device() {
  return 'ontouchstart' in window // works on most browsers 
      || 'onmsgesturechange' in window; // works on ie10
}

JavaScriptを使用して「タッチスクリーン」デバイスを検出する最良の方法は何ですか?

6
jcubic

TouchEventはモバイルデバイス専用であることを知っているので、最も簡単な方法は、ユーザーデバイスがそれをサポートできるかどうかを確認することです。

function isMobile() {
  try { 
       document.createEvent("TouchEvent"); 
       return true; 
     }
  catch(e) { 
       return false; 
     }
}
6
Alex Jolig

http://detectmobilebrowser.com/ に基づくシンプルな機能

function isMobile() {
    var a = navigator.userAgent||navigator.vendor||window.opera;
    return /(Android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|Kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|Palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4));
}
5
lucasls

これを使って:

/**  * jQuery.browser.mobile (http://detectmobilebrowser.com/)  * jQuery.browser.mobile will be true if the browser is a mobile device  **/ (function(a){jQuery.browser.mobile=/Android.+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|Kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|Palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))})(navigator.userAgent||navigator.vendor||window.opera);

それからこれを使ってください。

if(jQuery.browser.mobile)
{
   console.log('You are using a mobile device!');
}
else
{
   console.log('You are not using a mobile device!');
}
5
NCoder

素晴らしい回答ありがとうございます。 Windows PhoneとZuneをサポートするための小さな改良

        if (navigator.userAgent.match(/Android/i) ||
             navigator.userAgent.match(/webOS/i) ||
             navigator.userAgent.match(/iPhone/i) ||
             navigator.userAgent.match(/iPad/i) ||
             navigator.userAgent.match(/iPod/i) ||
             navigator.userAgent.match(/BlackBerry/) || 
             navigator.userAgent.match(/Windows Phone/i) || 
             navigator.userAgent.match(/ZuneWP7/i)
             ) {
                // some code
                self.location="top.htm";
               }
4
Victor Juri
<script>
  function checkIsMobile(){
      if(navigator.userAgent.indexOf("Mobile") > 0){
        return true;
      }else{
        return false;
      }
   }
</script>

ブラウザに移動してnavigator.userAgentを取得しようとすると、ブラウザの情報は次のようになります。

Mozilla/5.0(Macintosh; Intel Mac OS X 10_13_1)AppleWebKit/537.36(GeckoのようなKHTML)Chrome/64.0.3282.186 Safari/537.36

あなたが携帯電話で行う場合も同じことはあなたがフォローしているでしょう

Mozilla/5.0(Linux; Android 8.1.0; Pixel Build/OPP6.171019.012)AppleWebKit/537.36(GeckoのようなKHTML)Chrome/61.0.3163.98 モバイル Safari/537.36

すべてのモバイルブラウザは "Mobile" を含む文字列を持つuseragentを持つことになるので、現在のユーザーエージェントがweb/mobileであるかどうかを確認するためにコードの上のスニペットを使用します。その結果に基づいて、必要な変更を加えます。

3

navigator.userAgentをチェックするだけでは必ずしも信頼できないことがわかった場合navigator.platformもチェックすることで、信頼性を高めることができます。以前の答えを簡単に修正したほうがうまくいくようです。

if (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ||
   (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.platform))) {
    // some code...
}
3
Mark

あなたはそれを簡単に扱うことができるようにメディアクエリを使うことができます。

isMobile = function(){
    var isMobile = window.matchMedia("only screen and (max-width: 760px)");
    return isMobile.matches ? true : false
}
3
vin

ユーザエージェント文字列は単独で信頼されるべきではありません。以下の解決策はあらゆる状況で機能します。

function isMobile(a) {
  return (/(Android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|Kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|Palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)));
}

そしてこの関数を呼び出します。

isMobile(navigator.userAgent || navigator.vendor || window.opera)
3
kaxi1993

これは私が私のプロジェクトで使用している私のコードです。

function isMobile() {
 try {
    if(/Android|webOS|iPhone|iPad|iPod|pocket|psp|Kindle|avantgo|blazer|midori|Tablet|Palm|maemo|plucker|phone|BlackBerry|symbian|IEMobile|mobile|ZuneWP7|Windows Phone|Opera Mini/i.test(navigator.userAgent)) {
     return true;
    };
    return false;
 } catch(e){ console.log("Error in isMobile"); return false; }
}
3
Kousha

mobiledetect.net はどうですか。

他の解決策はあまりにも基本的なようです。これは軽量のPHPクラスです。これは、モバイル環境を検出するために、特定のHTTPヘッダーと組み合わされたUser-Agentストリングを使用します。 WordPress、Drupal、Joomla、Magentoなどのサードパーティ製プラグインを使用することで、Mobile Detectの恩恵も受けられます。

以下のように検出することもできます

$.isIPhone = function(){
    return ((navigator.platform.indexOf("iPhone") != -1) || (navigator.platform.indexOf("iPod") != -1));

};
$.isIPad = function (){
    return (navigator.platform.indexOf("iPad") != -1);
};
$.isAndroidMobile  = function(){
    var ua = navigator.userAgent.toLowerCase();
    return ua.indexOf("Android") > -1 && ua.indexOf("mobile");
};
$.isAndroidTablet  = function(){
    var ua = navigator.userAgent.toLowerCase();
    return ua.indexOf("Android") > -1 && !(ua.indexOf("mobile"));
};
3
Nur Rony

サーバーサイドスクリプトを使用して、そこからJavaScript変数を設定することもできます。 

Phpの例

http://code.google.com/p/php-mobile-detect/ をダウンロードして、JavaScript変数を設定します。 

<script>
//set defaults
var device_type = 'desktop';
</script>

<?php
require_once( 'Mobile_Detect.php');
$detect = new Mobile_Detect();
?>

<script>
device_type="<?php echo ($detect->isMobile() ? ($detect->isTablet() ? 'tablet' : 'mobile') : 'desktop'); ?>";
alert( device_type);
</script>
2
Pawel Dubiel

これを使う 

if(navigator.userAgent.search("mobile")>0 ){
         do something here
}
2
Yene Mulatu

私は いくつかの方法を試してみました それから私は手動でリストを埋めて簡単なJSチェックをすることにしました。そして最後に、ユーザーは確認する必要があります。なぜなら、いくつかのチェックが誤ったポジティブまたはネガティブを与えたからです。

var isMobile = false;
if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Opera Mobile|Kindle|Windows Phone|PSP|AvantGo|Atomic Web Browser|Blazer|Chrome Mobile|Dolphin|Dolfin|Doris|GO Browser|Jasmine|MicroB|Mobile Firefox|Mobile Safari|Mobile Silk|Motorola Internet Browser|NetFront|NineSky|Nokia Web Browser|Obigo|Openwave Mobile Browser|Palm Pre web browser|Polaris|PS Vita browser|Puffin|QQbrowser|SEMC Browser|Skyfire|Tear|TeaShark|UC Browser|uZard Web|wOSBrowser|Yandex.Browser mobile/i.test(navigator.userAgent) && confirm('Are you on a mobile device?')) isMobile = true;

さて、あなたがCSSを設定するためにjQueryを使いたいなら、あなたは以下をすることができます:

$(document).ready(function() {
  if (isMobile) $('link[type="text/css"]').attr('href', '/mobile.css');
});

モバイル機器と固定機器の間の境界が滑らかになり、モバイル閲覧者がすでに強力になっているので、幅のチェックとユーザー確認はおそらく今後最良となるでしょう(場合によっては幅が依然として重要であると仮定)。タッチはすでにマウスの上下に変換されているからです。

そしてモバイルの可動性に関しては、 Yoav Barneaの考え :について考えることをお勧めします。

if(typeof window.orientation !== 'undefined'){...}
2
Albert

Checkout http://detectmobilebrowsers.com/ を含むさまざまな言語でモバイルデバイスを検出するためのスクリプトを提供します

JavaScript、jQuery、PHP、JSP、Perl、Python、ASP、C#、ColdFusionなど

2
Akshay Khale

また、私は小さなJavaScriptライブラリーBowserを使用することをお勧めします。これはnavigator.userAgentに基づいており、iPhone、Androidなどを含むすべてのブラウザでよくテストされています.

https://github.com/ded/bowser

あなたは単に言うことができます:

if (bowser.msie && bowser.version <= 6) {
  alert('Hello China');
} else if (bowser.firefox){
  alert('Hello Foxy');
} else if (bowser.chrome){
  alert('Hello Silicon Valley');
} else if (bowser.safari){
  alert('Hello Apple Fan');
} else if(bowser.iphone || bowser.Android){
  alert('Hello mobile');
}
2
arikan
function isDeviceMobile(){
 var isMobile = {
  Android: function() {
      return navigator.userAgent.match(/Android/i) && navigator.userAgent.match(/mobile|Mobile/i);
  },
  BlackBerry: function() {
      return navigator.userAgent.match(/BlackBerry/i)|| navigator.userAgent.match(/BB10; Touch/);
  },
  iOS: function() {
      return navigator.userAgent.match(/iPhone|iPod/i);
  },
  Opera: function() {
      return navigator.userAgent.match(/Opera Mini/i);
  },
  Windows: function() {
      return navigator.userAgent.match(/IEMobile/i) || navigator.userAgent.match(/webOS/i) ;
  },
  any: function() {
      return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
  }
};      
 return isMobile.any()
}
2
mohamed-ibrahim

これが純粋なJavaScriptで実装されたもう一つの提案です(es6)

const detectDeviceType = () =>
    /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
        ? 'Mobile'
        : 'Desktop';

detectDeviceType();
1
Gor
var device = {
  detect: function(key) {
    if(this['_'+key] === undefined) {
      this['_'+key] = navigator.userAgent.match(new RegExp(key, 'i'));
    }
    return this['_'+key];
  },
  iDevice: function() {
    return this.detect('iPhone') || this.detect('iPod');
  },
  Android: function() {
    return this.detect('Android');
  },
  webOS: function() {
    return this.detect('webOS');
  },
  mobile: function() {
    return this.iDevice() || this.Android() || this.webOS();
  }
};

私は過去にこのようなものを使ったことがあります。これは前の応答と似ていますが、特に検出がアニメーション、スクロールイベントなどで使用されている場合は、一致の結果をキャッシュするという点で技術的により高性能です。

1
Fran

追加中:

iOS 9.x の一部のバージョンでは、Safariは "iPhone"をnavigator.userAgentに表示しませんが、navigator.platformに表示します。

var isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent);
    if(!isMobile){
        isMobile=/iPhone|iPad|iPod/i.test(navigator.platform);
    }
1
NikitOn

これは包括的で現代的な解決策のようです。

https://github.com/matthewhudson/device.js

それはいくつかのプラットフォーム、スマートフォン対タブレット、そして向きを検出します。また、BODYタグにクラスを追加するので、検出は一度だけ行われ、簡単な一連のjQueryのhasClass関数を使用して、使用しているデバイスを確認できます。

見てみな...

[免責事項:私はそれを書いた人とは何の関係もない。

1
Paolo Mioni

モバイルデバイスでタッチ可能なものを理解している場合は、タッチハンドラの存在を確認することでそれを判断できます。

let deviceType = (('ontouchstart' in window)
                 || (navigator.maxTouchPoints > 0)
                 || (navigator.msMaxTouchPoints > 0)
                 ) ? 'touchable' : 'desktop';

jQueryは必要ありません。

1
Daniel Kucal

私はこの古い質問を知っています、そして多くの答えがあります、しかし、私はこの機能が単純で、それが魅力のように働くすべてのモバイル、タブレットとコンピュータブラウザを見つけるのを手伝うと思います。

function Device_Type() 
{
    var Return_Device; 
    if(/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone|Android|iemobile|w3c|acs\-|alav|alca|amoi|audi|avan|benq|bird|blac|blaz|brew|cell|cldc|cmd\-|dang|doco|eric|hipt|inno|ipaq|Java|jigs|kddi|keji|leno|lg\-c|lg\-d|lg\-g|lge\-|maui|maxo|midp|mits|mmef|mobi|mot\-|moto|mwbp|nec\-|newt|noki|Palm|pana|pant|phil|play|port|prox|qwap|sage|sams|sany|sch\-|sec\-|send|seri|sgh\-|shar|sie\-|siem|smal|smar|sony|sph\-|symb|t\-mo|teli|tim\-|tosh|tsm\-|upg1|upsi|vk\-v|voda|wap\-|wapa|wapi|wapp|wapr|webc|winw|winw|xda|xda\-) /i.test(navigator.userAgent))
    {
        if(/(tablet|ipad|playbook)|(Android(?!.*(mobi|opera mini)))/i.test(navigator.userAgent)) 
        {
            Return_Device = 'Tablet';
        }
        else
        {
            Return_Device = 'Mobile';
        }
    }
    else if(/(tablet|ipad|playbook)|(Android(?!.*(mobi|opera mini)))/i.test(navigator.userAgent)) 
    {
        Return_Device = 'Tablet';
    }
    else
    {
        Return_Device = 'Desktop';
    }

    return Return_Device;
}
1

http://www.w3schools.com/jsref/prop_nav_useragent.asp

プラットフォーム名でフィルタリングします。

例:

x = $( window ).width();

platform = navigator.platform;

alert(platform);

if ( (platform != Ipad) || (x < 768) )  {


} 

^^

粗雑ですが、電話やタブレット/デスクトップ上のビデオファイルなどの大きなリソースの読み込みを制限するには十分です-両方の方向をカバーするために、単に幅または高さを小さくしてください。明らかに、デスクトップブラウザーのサイズが変更された場合、以下が誤って電話を検出する可能性がありますが、それは私のユースケースに十分なほど近いです。

なぜ480、bcsは、電話デバイスのサイズについて私が見つけた情報に基づいて正しいと思われるものです。

if(document.body.clientWidth < 480 || document.body.clientHeight < 480) {
  //this is a mobile device
}
0
Ron Royston

あなたがモバイルを検出したいものによっては(この提案がすべての人のニーズに適するわけではないことを意味します)、 この回答)で説明したようにonmouseenterとonclickのミリ秒の違いを見れば区別できます

0
WoodrowShigeru

これらは私が知っているすべての価値です。他の値を知っている場合は、配列の更新を手伝ってください。

function ismobile(){
   if(/Android|webos|iphone|ipad|iPod|blackberry|opera mini|Windows Phone|iemobile|WPDesktop|XBLWP7/i.test(navigator.userAgent.toLowerCase())) {
       return true;
   }
   else
    return false;
}
0
Kareem

私は自分の.NETアプリケーションに対してこれを行います。

私の共有_Layout.cshtmlページに、これを追加します。

@{
    var isMobileDevice = HttpContext.Current.Request.Browser.IsMobileDevice;
}

<html lang="en" class="@((isMobileDevice)?"ismobiledevice":"")">

それからあなたのサイトの任意のページをチェックするには(jQuery):

<script>
var isMobile = $('html').hasClass('ismobiledevice');
</script>
0
Mickey