モバイルブラウザーの検出


889

ユーザーがモバイルブラウザーを使用しているかどうかにかかわらず、ブール値を返す関数を探しています。

navigator.userAgentregexを使用してその関数を使用および記述できることはわかっていますが、ユーザーエージェントはプラットフォームごとに多すぎます。可能なすべてのデバイスを一致させるのが簡単だとは思えません。この問題は何度も解決されていると思います。そのため、そのようなタスクには完全な解決策があるはずです。

私はこのサイトを見ていましたが、残念なことにスクリプトは非常に不可解なので、目的に使用する方法がわかりません。つまり、true / falseを返す関数を作成することです。



2
これを読んでみてください。stackoverflow.com/questions/743129/…–
KyelJmD

5
@Thrustmaster:本当にそうではない。さまざまなブラウザにさまざまなJSを提供することはVary: User-Agent、応答に追加する必要があることを意味します。そうしないと、プロキシをキャッシュすると、1つのバージョンが保存され、別の種類のブラウザに送信されます。しかしVary: User-Agent、IEでは応答を取得できません。
ボビンス2012

17
@ave:「モバイル」ブラウザを検出して何をしようとしていますか?この違いは、今日のタブレットとハイブリッドコンピューティングデバイスの世界では非常に議論の余地があります。小さな画面を検出し、その場合に別のUIを表示することを考えていますか?低帯域幅の接続を検出しようとしていますか?タッチインターフェイスの検出を検討していますか?
ボビンス2012

2
だから私はdetectmobilebrowsers.com javascriptメソッドを使用するように私の答えを更新しましたが、まだこれが必要な場合はブール値を返します。( 念のため )。Happy Detecting :)
Michael Zaporozhets

回答:


1318

正規表現の使用(detectmobilebrowsers.comから):

これは、ユーザーがモバイルでブラウジングしているかどうかに応じて、trueまたはfalse値を返す、めちゃくちゃ長くて包括的な正規表現を使用する関数です。

window.mobileCheck = function() {
  let check = false;
  (function(a){if(/(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))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
  return check;
};

このテストにタブレットを含めることを希望する場合(間違いなくそうするべきではありませんが)、次の関数を使用できます。

window.mobileAndTabletCheck = function() {
  let check = false;
  (function(a){if(/(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|android|ipad|playbook|silk/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))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
  return check;
};

元の答え

これを行うには、デバイスのリストを実行し、が次のようにuseragent一致するかどうかを確認します。

  function detectMob() {
    const toMatch = [
        /Android/i,
        /webOS/i,
        /iPhone/i,
        /iPad/i,
        /iPod/i,
        /BlackBerry/i,
        /Windows Phone/i
    ];

    return toMatch.some((toMatchItem) => {
        return navigator.userAgent.match(toMatchItem);
    });
}

ただし、この方法は信頼できないと思われるため、800x600以下の解像度を持つデバイスもモバイルデバイスであると想定して、ターゲットをさらに狭めることができます(最近の多くのモバイルデバイスの解像度はこれよりもはるかに高くなっています)。

すなわち

  function detectMob() {
    return ( ( window.innerWidth <= 800 ) && ( window.innerHeight <= 600 ) );
  }

参照:


25
こんにちは、iPad 3、iOS 6.1.2 のdetectmobilebrowsers.comリンクにアクセスしたところ、「モバイルブラウザーが検出されませんでした」と表示されています。
Richard Lovejoy 2013年

49
@RichardLovejoyがサイトを構築する場合、iPadは通常モバイルとは見なされません。
Michael Zaporozhets 2013年

42
およそページ:Androidタブレット、iPadの、Kindleの火災やプレイブックは、デザインによって検出されていません。タブレットのサポートを追加|android|ipad|playbook|silkするには、最初の正規表現に追加します。
Gras Double

13
Google TVもAndroidです。モバイルとは何ですか?画面サイズ ?接する ?deviceOrientation?私がデザインするときは、マウスホバーかどうか、大きなボタンか小さなリンクの問題です。それで、今のところ、私は "if(Modernizr.touch)"で実行します:)
molokoloco

31
ユーザーエージェントのこのアイデア全体はひどいものであり、本当に、本当に止める必要があります。私たちは、クライアントが潮流に立ち向かい、メディアクエリに固執することを許可するのを止める必要があります。彼らは、特定のページのスケールに基づいてリダイレクトを行いたい場合は、単にクエリを介したJSすなわち、特定のメディアの範囲をチェックtylergaw.com/articles/reacting-to-media-queries-in-javascript
marksyzm

324

どうですか:

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

...スマートフォンは通常このプロパティをサポートしており、デスクトップブラウザはサポートしていないためです。

編集: @Gajusが指摘したように、このソリューションは現在廃止されており、使用すべきではありません(https://developer.mozilla.org/en-US/docs/Web/API/Window/orientation


14
これは実際に非常にユニークで素晴らしいです、私の答えに追加してもよろしいですか?
Michael Zaporozhets 2013年

77
これはおそらく長くは機能しません。1)タブレットは適切な画面サイズにすることができます。デスクトップのウェブサイト全体を表示したいのですが、このプロパティを備えています。2)Windows 8はここにあり、タッチスクリーンと画面が回転するラップトップの束があります。
Dave Hilditch、2013

10
まともな画面サイズのタブレットに関する最初のポイントについては、他のすべてのソリューション(同じように小さな画面として追跡される大きな画面を備えたタブレット)についても同じことが言えると思います。とにかく、ここでのアイデアは、メインテナンスの長いコードを保持する代わりに、小さなデバイスで共有されているプロパティを検索し、すべての新しいデバイス/バージョン/モデルに正規表現を追加することです。デバイス検出は過去のものであり、今日は機能検出に焦点を当てる必要があります。ここでも、その問題に適したプロパティについてここで喜んでいます...
yoav barnea 2013年

2
それを愛し、完璧に動作します、ありがとう。私の解決策については、私は単純な後だった。
Bojangles 2013年

40
window.orientation廃止予定のプロパティ(あるdeveloper.mozilla.org/en-US/docs/Web/API/Window/orientationcompat.spec.whatwg.org/#dom-window-orientationは)一部のモバイルブラウザは未知の理由のためにサポートすることを選択することを。同じブラウザが実装window.screen.orientationされています(これはデスクトップブラウザでも定義されています)。私はそれwindow.orientationがレガシーの理由のためにそこに残されていると仮定することができるだけであり、したがって新しいアプリケーションで使用されるべきではありません。
Gajus

115
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) || navigator.userAgent.match(/WPDesktop/i);
    },
    any: function() {
        return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
    }
};

使い方

if( isMobile.any() ) alert('Mobile');

ユーザーが特定のモバイルデバイスを使用しているかどうかを確認するには:

if( isMobile.iOS() ) alert('iOS');

参照:http : //www.abeautifulsite.net/blog/2011/11/detecting-mobile-devices-with-javascript

githubの拡張バージョン:https : //github.com/smali-kazmi/detect-mobile-browser


any()ORed isMobileメンバーのfor ... inループを作成しませんか?
SomeShinyObject 2014年

@ChristopherW私はあなたが助言したようにプラグインを作成し、コードを変更しました
Mudaser Ali

2
たぶん、iOSをBlackBerry()より先に進めて、より一般的なケースを最初に置き、早期の救済で追加の処理を節約できるようにするのでしょうか。
Rob_vH 2015年

2
@Rob_vH私はこのコードをいくつかの高度な機能を備えたgithub(github.com/smali-kazmi/detect-mobile-browser)に入れました。そこに提案を送信することもできます
Mudaser Ali

1
@AkarshSatija 5つの正規表現チェックによるパフォーマンスの低下は、実際にアプリケーションに影響を与えますか?もしそうなら、私は非常に驚きます。時期尚早の最適化は時間の浪費になる可能性があります...
trusktr

68

Facebookのパチンコのソースからの簡単なソリューションは次のとおりです

var isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
if (isMobile) {
  /* your code here */
}

いいね。特定の状況で非常に役立ちます
チャックルバット

モバイルアプリをインストールできるデバイスを検出する場合に役立ちます。ブラウザ自体は気にしません。ただのデバイス/ OS。
チャーリーReitzel

31

私はモバイルとタブレットに分類される「タッチスクリーンデバイス」を検出するシンプルでクリーンな方法を探してここに来ました。現在の回答で明確な選択を見つけられませんでしたが、誰かを助けることもできる以下を解決しました。

var touchDevice = ('ontouchstart' in document.documentElement);

編集:タッチスクリーンを備えたデスクトップとモバイルを同時にサポートするには、以下を使用できます。

var touchDevice = (navigator.maxTouchPoints || 'ontouchstart' in document.documentElement);

9
デスクトップのモニターがタッチをサポートしている場合はどうなりますか?
アントンクズミン

@HappyCoderデスクトップのタッチスクリーンがアクティブなときにブラウザに通知するのはOSの責任だと思います。したがって、はい、このチェックは引き続き有効です。
Tigger

(+1)ただし、現在使用しているデスクトップにはtouchScreenがあり、で常に一貫しているとは限りませんtouchstart|end|etc
Cody

1
ブートストラップの日付ピッカーは次を使用します:if(window.navigator.msMaxTouchPoints || 'ontouchstart' in document){this.input.blur(); }
JTテイラー

1
@JTTaylorマイクロソフトが推奨し ているようですnavigator.maxTouchPointsmsプレフィックスなし)。チェックするMDN記事もあります。
Tigger

20

多くの人が述べたように、ユーザーエージェントデータの移動するターゲットに依存することには問題があります。画面サイズを考慮しても同じことが言えます。

私のアプローチは、インターフェースがタッチであるかどうかを判断するためにCSSテクニックから借用されました。

JavaScript(最新のすべてのブラウザーでサポート)のみを使用すると、メディアクエリの一致により、デバイスがモバイルかどうかを簡単に推測できます

function isMobile() {
    var match = window.matchMedia || window.msMatchMedia;
    if(match) {
        var mq = match("(pointer:coarse)");
        return mq.matches;
    }
    return false;
}

6
タッチ対応ディスプレイを備えたラップトップについてはどうですか?
マキシム

6
私は!matchMedia( "(any-pointer:fine)")。matchesを自分で確認します。(「マウスは接続されていません」ではなく、「タッチスクリーンがあります。」
Sora2455

これは機能しますが、最後のスクリプトはブラウザーのズーム機能を使用しているユーザーに騙されます(たとえば、13Kの画面で4Kで1080pに落としていてズームを使用する必要があった人)。私のiPhone(Safari / Firefox)およびAndroidデバイス(Waterfox / Chrome / "Browser")。投票数の多い回答よりもはるかに信頼性が高い
John

navigator.userAgent.toLowerCase()。indexOf( 'fennec')> -1で補足したAndroidでFireFox fennecを検出しません(おそらく最高の補足ではありません。)
StayCool

2
さらに、ホバープロパティをテストできます。スマートフォンおよびタッチスクリーンの場合@media(ホバー:なし)および(ポインター:粗い)
Batailley

16

ユーザーエージェントを使用したブラウザ検出に関するMDNの記事によると、可能であればこのアプローチを回避し、機能検出などの他の手段を提案することをお勧めします。

ただし、デバイスがモバイルかどうかを検出する手段としてユーザーエージェントを使用する必要がある場合は、次のことをお勧めします。

要約すると、モバイルデバイスを検出するために、ユーザーエージェントの任意の場所で文字列「Mobi」を探すことをお勧めします。

したがって、このワンライナーで十分です:

const isMobileDevice = window.navigator.userAgent.toLowerCase().includes("mobi");

[更新]:

コメントで@ zenw0lfが示唆しているように、正規表現を使用する方が良いでしょう。

const isMobileDevice = /Mobi/i.test(window.navigator.userAgent)


.includesIE-11によるサポートなし
Pasha Oleynik

1
@PashaOleynikポリフィルでこれを修正できます
マキシム

Android搭載のNexus 7タブレットMobileにはユーザーエージェント文字列がありません
Alex Sorokoletov

@AlexSorokoletov MDN記事If the device is large enough that it's not marked with “Mobi”, you should serve your desktop site (which, as a best practice, should support touch input anyway, as more desktop machines are appearing with touchscreens).
TheDarkIn1978

1
これはポリフィルなしでどこでも機能すると思います: const isMobile = /Mobi/.test(window.navigator.userAgent)
zenw0lf

14

JSコードがモバイルブラウザーで実行されているかどうかを検出するための完全なソリューションはありませんが、ほとんどの場合、次の2つのオプションが機能します。

オプション1:ブラウザスニッフィング

!function(a){var b=/iPhone/i,c=/iPod/i,d=/iPad/i,e=/(?=.*\bAndroid\b)(?=.*\bMobile\b)/i,f=/Android/i,g=/(?=.*\bAndroid\b)(?=.*\bSD4930UR\b)/i,h=/(?=.*\bAndroid\b)(?=.*\b(?:KFOT|KFTT|KFJWI|KFJWA|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|KFARWI|KFASWI|KFSAWI|KFSAWA)\b)/i,i=/IEMobile/i,j=/(?=.*\bWindows\b)(?=.*\bARM\b)/i,k=/BlackBerry/i,l=/BB10/i,m=/Opera Mini/i,n=/(CriOS|Chrome)(?=.*\bMobile\b)/i,o=/(?=.*\bFirefox\b)(?=.*\bMobile\b)/i,p=new RegExp("(?:Nexus 7|BNTV250|Kindle Fire|Silk|GT-P1000)","i"),q=function(a,b){return a.test(b)},r=function(a){var r=a||navigator.userAgent,s=r.split("[FBAN");return"undefined"!=typeof s[1]&&(r=s[0]),s=r.split("Twitter"),"undefined"!=typeof s[1]&&(r=s[0]),this.apple={phone:q(b,r),ipod:q(c,r),tablet:!q(b,r)&&q(d,r),device:q(b,r)||q(c,r)||q(d,r)},this.amazon={phone:q(g,r),tablet:!q(g,r)&&q(h,r),device:q(g,r)||q(h,r)},this.android={phone:q(g,r)||q(e,r),tablet:!q(g,r)&&!q(e,r)&&(q(h,r)||q(f,r)),device:q(g,r)||q(h,r)||q(e,r)||q(f,r)},this.windows={phone:q(i,r),tablet:q(j,r),device:q(i,r)||q(j,r)},this.other={blackberry:q(k,r),blackberry10:q(l,r),opera:q(m,r),firefox:q(o,r),chrome:q(n,r),device:q(k,r)||q(l,r)||q(m,r)||q(o,r)||q(n,r)},this.seven_inch=q(p,r),this.any=this.apple.device||this.android.device||this.windows.device||this.other.device||this.seven_inch,this.phone=this.apple.phone||this.android.phone||this.windows.phone,this.tablet=this.apple.tablet||this.android.tablet||this.windows.tablet,"undefined"==typeof window?this:void 0},s=function(){var a=new r;return a.Class=r,a};"undefined"!=typeof module&&module.exports&&"undefined"==typeof window?module.exports=r:"undefined"!=typeof module&&module.exports&&"undefined"!=typeof window?module.exports=s():"function"==typeof define&&define.amd?define("isMobile",[],a.isMobile=s()):a.isMobile=s()}(this);

alert(isMobile.any ? 'Mobile' : 'Not mobile');

この特定のブラウザスニッフィングコードは、isMobileと呼ばれるライブラリのコードです。


オプション2:window.orientation

window.orientation定義されているかどうかをテストします。

var isMobile = window.orientation > -1;
alert(isMobile ? 'Mobile' : 'Not mobile');


注意

すべてのタッチスクリーンデバイスがモバイルであるとは限りません。したがって、タッチスクリーン用に何かを実装したい場合は、ブラウザがモバイルデバイスで実行されているかどうかをテストするのではなく、デバイスがタッチスクリーンをサポートしているかどうかをテストする必要があります。

var hasTouchscreen = 'ontouchstart' in window;
alert(hasTouchscreen ? 'has touchscreen' : 'doesn\'t have touchscreen');


オリエンテーションアプローチは本当にいいです!))
Maxim

1
私はあなたのwindow.orientationソリューションが好きですが、ドキュメントはそれが廃止されていると言います!developer.mozilla.org/en-US/docs/Web/API/Window/orientation
skwidbreth 2018

3
Windows 8以降では方向を変更できるため、方向アプローチは適切ではありません。
Heitor 2018

Windows 8以降は、モバイルのサポートを追加することに重点を置いていますが、ハイブリッド(大きなパッドに変換できるラップトップ)もあるため、mozが非推奨として参照していなくても、検出方法として向きが失敗します。
ジェフクレイトン

グラフィカルソフトウェアがインストールされたWin 7からのものですが、向きを変えることができますが、デスクトップ/ラップトップでは、横向きではなく縦向きなどの別の画面向きを使用して、1分以上iを使用できます。誰も !!!デスクトップの向きを変更すると、画面の文字が下から上に読み始めます。
GirlCode

11

これは、マッチよりも効率的なuserAgentソリューションです...

function _isMobile(){
    // if we want a more complete list use this: http://detectmobilebrowsers.com/
    // str.test() is more efficent than str.match()
    // remember str.test is case sensitive
    var isMobile = (/iphone|ipod|android|ie|blackberry|fennec/).test
         (navigator.userAgent.toLowerCase());
    return isMobile;
}

7
テスト方法では大文字と小文字が区別されませんが、正規表現では区別されます。大文字と小文字を区別しない正規表現の最後に "i"を付けてフラグを立てることができます/iphone|etc/i.test(navigator.userAgent)
xec

11

追加の制御レイヤーを追加するには、HTML5ストレージを使用して、モバイルストレージとデスクトップストレージのどちらを使用しているかを検出します。ブラウザーがストレージをサポートしていない場合、モバイルブラウザー名の配列があり、ユーザーエージェントを配列内のブラウザーと比較します。

とてもシンプルです。これが関数です:

// 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
    var mobile = ['iphone','ipad','android','blackberry','nokia','opera mini','windows mobile','windows phone','iemobile']; 
    for (var i in mobile) if (navigator.userAgent.toLowerCase().indexOf(mobile[i].toLowerCase()) > 0) return true;

    // nothing found.. assume desktop
    return false;
}

3
私はまだモバイルでテストしていsessionStorage.desktopませんが、Safari、Chrome、Firefox(ポスト時のすべての最新バージョン)には存在しません。しかし、あなたのソリューションは他のソリューションよりも良い方向に進んでいるので、賛成票を獲得します。ただし、のvar mobile =代わりに使用することを忘れないでくださいmobile =
shuckster 2013

3
また、そのメソッドをサポートしていない古いブラウザでindexOfを使用しないか、ポリフィルを使用することもお勧めします。小文字のリストでtoLowerCaseを使用する必要はありません。また、そこにある低速ループの代わりに/ipad|iphone|etc/i.test(navigator.userAgent)を実行している場合も、そうする必要はありません。
Jeffrey Gilbert

10

機能の検出は、どのデバイスを使用しているかを把握しようとするよりもはるかに優れており、常に新しいデバイスに対応することは非常に困難です。Modernizrのようなライブラリは、特定の機能が利用可能かどうかを通知します。


18
質問されたものとは別の質問に回答しました。「特定の機能を検出するにはどうすればよいですか?」ではなく、「どのようにしてモバイルを検出できますか?」すべてのデバイス検出が機能検出用であるとは限りません。デバイスに関する統計情報を取得しようとしていた場合はどうなりますか?その場合、「機能検出」は「[デバイスを構成する]よりもはるかに優れている」とは言えません。
ジョナサンアラード2016年

1
これは答えではありませんが、単なるコメント以上の価値があります。問題は、なぜブラウザーを検出する必要があるのか​​、そしてタッチ(の欠如)だけのために、おそらくブラウザーを検出したいということです。すべてではないにしてもほとんどの場合、レスポンシブウェブデザインで十分です。
twicejr

8

このようなものはどうですか?

if(
    (screen.width <= 640) || 
    (window.matchMedia && 
     window.matchMedia('only screen and (max-width: 640px)').matches
    )
  ){
   // Do the mobile thing
}

screen.width代わりに使用しないのはなぜですか?それは私よりも信頼できるようですwindow.matchMedia
John Slegers 2016年

良い点ジョン、そのとき私が考えていたことを正確に思い出すことはできません。最初の節が偽の場合、2番目の節が真を返すことは(今のところ見て)ありそうにありません。私がそれを追加したいくつかの理由があったに違いありません。
stujo 2016年

ほとんどのまともなプログラマーは、1年前に自分で書いたコードを見ると恥ずかしいと感じます。プログラマーとして成長していないだけの人;-)
John Slegers 2016年

4
ウィンドウの解像度は、ブラウザーがモバイルデバイス上にあるかどうかに関係しません。たとえば、多くのデスクトップブラウザは全画面表示されていないウィンドウで実行されます。ハンドヘルド画面向けに設計されたUIをこれらのブラウザーに提示すると、ユーザーは不満を感じることになります。
ʇsәɹoɈ

1
@JohnSlegers-私は主に質問をグーグルして、stackoverflowで自分の答えを見つけることを恥じています。何回も何回も。私自身、常にスタックオーバーフローになっています
vsync

7

要素がフォーカスを得ると、すぐにぼかします。Bootstrap-datepickerは、GitHubで1万個近くの星を持つ非常に人気があり、維持管理されているコンポーネントで、次のアプローチを使用しています。

if (window.navigator.maxTouchPoints || 'ontouchstart' in document) {
    this.input.blur();
}

https://github.com/uxsolutions/bootstrap-datepicker

支援してくれたTiggerに感謝します。


7

モバイルまたはタブレットデバイスを検出する本当に良い方法は、ブラウザーがタッチイベントを作成できるかどうかを調べることです。

プレーンJavaScriptコード:

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

if (isMobile()) {
   # do whatever you wanna do!
}

これは本当にうまくいきましたが、タッチスクリーンディスプレイを含むラップトップデバイスに問題があるかもしれません。

まだテストしていないため、タッチスクリーンラップトップがモバイルデバイスとして検出されるかどうかはわかりません。


5
タッチスクリーンのラップトップはモバイルデバイスとして検出されます。デスクトップ用のタッチスクリーンモニターも同様です。信じられないかもしれませんが、タッチスクリーンデバイスを使用して、タッチスクリーンがない別のデバイスにRDPする場合にも問題が発生します。
blissfool

@blissfoolこれは、モバイルデバイスを検出するための正しい方法ではないと思います。
Neo Morina

残念だけど違う。しかし、それは非常に限られたユースケースでは実行可能なオプションであるかもしれません。
blissfool

例外に基づいたコードは絶対に記述しないでください。必ずスローされます...
Pablo

@Sivicは、TouchEventが存在せず、上記のコードがそれをキャッチしてfalseを返す場合にのみスローされます。これは、モバイル、タブレット、その他のタッチスクリーンデバイスには当てはまりません。
ネオMorina

5

これが問題に対する私の考え直された解決策です。まだ完璧ではありません。唯一の真の解決策は、デバイスメーカーが「モバイル」と「タブレット」のユーザーエージェント文字列を真剣に取り始めた場合です。

window.onload = userAgentDetect;
function userAgentDetect() {
  if(window.navigator.userAgent.match(/Mobile/i)
  || window.navigator.userAgent.match(/iPhone/i)
  || window.navigator.userAgent.match(/iPod/i)
  || window.navigator.userAgent.match(/IEMobile/i)
  || window.navigator.userAgent.match(/Windows Phone/i)
  || window.navigator.userAgent.match(/Android/i)
  || window.navigator.userAgent.match(/BlackBerry/i)
  || window.navigator.userAgent.match(/webOS/i)) {
    document.body.className += ' mobile';
    alert('True - Mobile - ' + navigator.userAgent);
  } else {
    alert('False - Mobile - ' + navigator.userAgent);
  }
  if(window.navigator.userAgent.match(/Tablet/i)
  || window.navigator.userAgent.match(/iPad/i)
  || window.navigator.userAgent.match(/Nexus 7/i)
  || window.navigator.userAgent.match(/Nexus 10/i)
  || window.navigator.userAgent.match(/KFAPWI/i)) {
    document.body.className -= ' mobile';
    document.body.className += ' tablet';
    alert('True - Tablet - ' + navigator.userAgent);
  } else {
    alert('False - Tablet - ' + navigator.userAgent);
  }
}

Nexus 7タブレットにAndroid UA文字列しかない場合はどうなりますか?最初に、モバイルがtrueになり、後でタブレットもtrueになりますが、タブレットは本体タグからモバイルUA文字列を削除します。

CSS:

body.tablet { background-color: green; }
body.mobile { background-color: red; }

alert開発のために追加された行。Chromeコンソールは、多くのハンドヘルドデバイスをエミュレートできます。そこでテストします。

編集:

これを使用せず、代わりに機能検出を使用してください。世の中には非常に多くのデバイスとブランドがあり、ブランドをターゲットにすることは決して適切なソリューションではありません。


4

http://wurfl.io/をチェックすることをお勧めします

一言で言えば、小さなJSファイルをインポートする場合:

<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.form_factor == "Tablet"){
    //dostuff();
}

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

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


1
そして、これがiPhoneのSafariを認識しないのはなぜですか?
エイミス2016

使用しているブラウザー(正確なUA文字列が最適です)、取得しているデータ、期待しているものを拡張できますか?
Luca Passani 2016

私もwurflを試しました。IOS11.2を実行しているiPhone 5Cを使用しています。Safariをモバイルブラウザとして認識しません。私は "is_mobile":trueを使用し、次に "form_factor"を使用することを期待しています。スマートフォンとそのどちらも返されません。
マイクウェルズ

私は会社のモバイルデータの教祖に頼らざるを得ませんでしたが、OS 11.2は5Cで実行できないと言われました。最も低いデバイスは5Sです。だからあなたが書いたものに何かがおかしい。切断がどこにあるかを確認するには、ScientiaMobileにオフラインで連絡してください。ありがとう
Luca Passani 2017年

4

ワンライナー

function isMobile() {
  return (typeof window.orientation !== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1);
};

3

ユースケースによって異なります。すべてのモバイルデバイスにはバッテリーが必要です。バッテリーを消耗させずに電力を計算する場合は、Battery Status APIを使用します

navigator.getBattery().then(battery => {
  battery.charging ? 'charging' : 'not charging';
});

あなたが探しているものがmatchMediaブール値を返すプレゼンテーション用である場合:

if (window.matchMedia("(min-width: 400px)").matches) {
  /* the viewport is at least 400 pixels wide */
} else {
  /* the viewport is less than 400 pixels wide */
}

または、タブレットデバイスでのユーザーエクスペリエンスをさらに向上させるためにそれらを組み合わせます。


Battery Status APIがブラウザから削除されていることに注意してください。
Sora2455

Battery Status APIはFirefoxから削除されましたが、2016年7月以降もW3C候補の推奨事項として残っており、人気のあるブラウザーで引き続き機能し、エクスペリエンスの形成に役立ちます。
Josh Habdas

2

これがECMAScript 6ソリューションです(TypeScript対応)。

public isMobile(): boolean {
  let check = false;
  ((a => {
      if (/(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))) check = true;
      }))(navigator.userAgent || navigator.vendor);
  return check;
 }

ifこのcheck変数全体ではなく、単に条件を返さないのはなぜですか?
Vic

2

それがモバイルデバイスであるかどうかを検出する簡単なトリックがあります。ontouchstartイベントが存在するかどうかを確認します。

function isMobile()
{
    return "ontouchstart" in window;
}

3
ノートパソコンやタッチスクリーンモニター付きのデスクトップでは使用できません。また、SurfaceなどのハイブリッドPCにも問題があります。デスクトップの問題は少ないですが、最近ではタッチスクリーンラップトップの販売が増えています。
blissfool

2

上記の答えが私にとってうまくいかないいくつかのシナリオに直面しました。だから私はこれを思いついた。誰かに役立つかもしれません。

if(/iPhone|iPad|iPod|Android|webOS|BlackBerry|Windows Phone/i.test(navigator.userAgent)
 || screen.availWidth < 480){
//code for mobile
}

ユースケースによって異なります。画面の使用screen.availWidthに重点を置く場合、またはdocument.body.clientWidthドキュメントに基づいてレンダリングする場合に使用できます。


1

最高のものでなければなりません:

var isMobile = (/Mobile/i.test(navigator.userAgent));

しかし、Yoav Barneaが言うように...

// Seem legit
var isMobile = ('DeviceOrientationEvent' in window || 'orientation' in window);
// But with my Chrome on windows, DeviceOrientationEvent == fct()
if (/Windows NT|Macintosh|Mac OS X|Linux/i.test(navigator.userAgent)) isMobile = false;
// My android have "linux" too
if (/Mobile/i.test(navigator.userAgent)) isMobile = true;

この3つのテストの後、var isMobileが...


> Android上のFirefoxモバイルに「ウィンドウ内の向き」がないようです
molokoloco

1
すみません。大丈夫です。今はそのようにうまく機能しています。"if(Modernizr.touch)/ * ... * /"そして続行...
molokoloco

タッチスクリーンのデスクトップデバイスでModernizr.touchがどのように機能するのか疑問に思っています。
B2K、2015

よりエレガントにするためには、すべてのコードを1つのif-else if-else ifブロックで作成する必要があります。
Heitor 2018

1

これが彼の全機能です

function isMobile(){
    return (/(android|bb\d+|meego).+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|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino|android|ipad|playbook|silk/i.test(navigator.userAgent||navigator.vendor||window.opera)||/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||navigator.vendor||window.opera).substr(0,4)))
}

jQuery.noConflict();
jQuery(document).ready(function(){
    if(isMobile()) alert("Mobile"); else alert("Not Mobile");
});

.substr(0,4)は最初の4文字を返します。「android。+ mobile」はどのように検出されますか?
raacer

1
@raacer答えには実際には2つの正規表現があります(両方とも同じ行にあります)-最初の1つはUA文字列全体をチェックし、android、mobileなどを探しますが、2つ目はUAの最初の4文字のみをチェックします。
JackW

1
//true / false
function isMobile()
{
   return (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ); 
}

また、このチュートリアルに従って特定のモバイルを検出することもできます。こちらをクリックしてください


MobileRXに追加してください
oriadam

1

「window.screen.width」の使用についてはどうですか?

if (window.screen.width < 800) {
// do something
}

または

if($(window).width() < 800) {
//do something
}

毎日新しいモバイルデバイスがあるので、これが最善の方法だと思います。

(古いブラウザではサポートされていないようですが、試してみてください:))


1
風景とは?
Erick Voodoo 2017

1
これは特定のシナリオではあまり役に立ちません。デスクトップブラウザのサイズを変更すると、モバイルブラウザとして誤って検出される可能性があります
toing_toing 2017年

PCは基本的にモバイルデバイスとは使い勝手が異なり、恐ろしい答えです!!
Heitor 2018

1

最近のほとんどのモバイルデバイスの解像度は600x400を超えていることに注意してください。つまり、iPhone 6 ....

テストの証拠:ここで最も投票された最新の投稿を実行し、オプションのチェックを次のように実行します:

(function(a){
    window.isMobile = (/(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)))
})(navigator.userAgent||navigator.vendor||window.opera);

alert("This browser was found to be a % browser.", window.isMobile ? 'mobile' : 'desktop');

どういうわけか、次のブラウザアプリで次の結果が返されました。仕様:iPhone 6S、iOS 10.3.1。

Safari(最新):モバイルとして検出されました。

Chrome(最新):モバイルとして検出されませんでした。

SO、それから私はLantihttps://stackoverflow.com/a/31864119/7183483)からの提案をテストし、それは適切な結果(すべてのiOSデバイスではモバイル、私のMacではデスクトップ)を返しました。したがって、2回起動するため(モバイルとタブレットの両方で)、少し編集を進めました。その後、iPadでテストしたところ、モバイルとしても返されることに気付きました。何よりもOSのチェックを使用します。したがって、私は単にタブレットのIFステートメントをモバイルチェック内に移動しました。これは、モバイルがタブレットチェックを否定し、それ以外の場合はタブレットを返すというものです。次に、モバイルチェックがデスクトップ/ラップトップとして返​​されるようにelse句を追加しました。どちらも対象であるため、ブラウザーがCPUとOSのブランドを検出することに気付きました。そこで、代わりにelse ifステートメントの一部としてそこに返されるものを追加しました。それを制限するために、何も検出されなかった場合に備えて、警告するelseステートメントを追加しました。下記を参照してください。Windows10 PCでのテストによりまもなく更新されます。

ああ、そしてデバッグと通常のコンパイルを簡単に切り替えるために、 'debugMode'変数も追加しました。

Dislaimer:への完全な信用Lanti OSがWindowsの純粋であることから、デスクトップ/ラップトップを返すことがありますまた、これは、Windowsのタブレット上でテストされていなかったことを、...。使っている友達を見つけたらチェックします。

function userAgentDetect() {
    let debugMode = true;
    if(window.navigator.userAgent.match(/Mobile/i)
        || window.navigator.userAgent.match(/iPhone/i)
        || window.navigator.userAgent.match(/iPod/i)
        || window.navigator.userAgent.match(/IEMobile/i)
        || window.navigator.userAgent.match(/Windows Phone/i)
        || window.navigator.userAgent.match(/Android/i)
        || window.navigator.userAgent.match(/BlackBerry/i)
        || window.navigator.userAgent.match(/webOS/i)) {
        if (window.navigator.userAgent.match(/Tablet/i)
            || window.navigator.userAgent.match(/iPad/i)
            || window.navigator.userAgent.match(/Nexus 7/i)
            || window.navigator.userAgent.match(/Nexus 10/i)
            || window.navigator.userAgent.match(/KFAPWI/i)) {
            window.deviceTypeVar = 'tablet';
            if (debugMode === true) {
                alert('Device is a tablet - ' + navigator.userAgent);
            }
        } else {
            if (debugMode === true) {
                alert('Device is a smartphone - ' + navigator.userAgent);
            };
            window.deviceTypeVar = 'smartphone';
        }
    } else if (window.navigator.userAgent.match(/Intel Mac/i)) {
        if (debugMode === true) {
            alert('Device is a desktop or laptop- ' + navigator.userAgent);
        }
        window.deviceTypeVar = 'desktop_or_laptop';
    } else if (window.navigator.userAgent.match(/Nexus 7/i)
        || window.navigator.userAgent.match(/Nexus 10/i)
        || window.navigator.userAgent.match(/KFAPWI/i)) {
        window.deviceTypeVar = 'tablet';
        if (debugMode === true) {
            alert('Device is a tablet - ' + navigator.userAgent);
        }
    } else {
        if (debugMode === true) {
            alert('Device is unknown- ' + navigator.userAgent);
        }
        window.deviceTypeVar = 'Unknown';
    }
}

1

これは、私のプロジェクトで使用している、承認済みの回答の es6ポートにすぎません。これにはタブレットも含まれることに注意してください。

export const isMobile = () => {
  const vendor = 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|xda|xiino|android|ipad|playbook|silk/i.test(
      vendor
    ) ||
    /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(
      vendor.substr(0, 4)
    )
  );
};

1

return 'ontouchstart' in window && window.screen.availWidth < 768

これはどうですか、上記の答えを拡張しますが、画面サイズもチェックします


1

正規表現の使用(detectmobilebrowsers.comから):

/* eslint-disable */
export const IS_MOBILE = (function (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)
      )
  )
  // @ts-ignore
})(navigator.userAgent || navigator.vendor || window.opera)
/* eslint-enable */

0

これも解決策になる可能性があります。

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;

  console.log('Mobile device:'+isMobile);

  var doc_h = $(document).height(); // returns height of HTML document
  var doc_w = $(document).width(); // returns width of HTML document
  console.log('Height: '+doc_h);
  console.log('width: '+doc_w);

  var iPadVertical = window.matchMedia("(width: 768px) and (height: 1024px) and (orientation: portrait)");
  var iPadHoricontal = window.matchMedia("(width: 1024px) and (height: 767px) and (orientation: landscape)");

  console.log('Height: '+doc_h);
  console.log('width: '+doc_w);

  if (iPadVertical.matches) {
      console.log('Ipad vertical detected');
  }else if (iPadHoricontal.matches){
      console.log('Ipad horicontal detected');
  }else {
      console.log('No Ipad');
  }

両方の方法を使用すると、さまざまなデバイスを検出するのに最適な方法が得られます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.