web-dev-qa-db-ja.com

JavaScriptを使用してモバイルデバイスを検出する方法

JavaScriptコードを使用してモバイルデバイス(iPhone/iPad/Android)の検出をシミュレートするために、実際のHTMLページ/ JavaScriptを作成するように求められました。これにより、ユーザーは別の画面に移動し、電子メールアドレスの入力を求められます。

73
Jeevs

私はこの答えが3年遅れていることを知っていますが、noneの他の答えは確かに100%正しいです。ユーザーが任意の形式のモバイルデバイス(Android、iOS、BlackBerry、Windows Phone、Kindleなど)を使用しているかどうかを検出する場合は、次のコードを使用できます。

if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|Opera Mini/i.test(navigator.userAgent)) {
    // Take the user to a different screen here.
}
74
Baraa

要求元のブラウザのユーザーエージェント文字列を検出し、モバイルブラウザからのものかどうかに基づいて判断します。このデバイスは完璧ではなく、ユーザーエージェントがモバイルデバイス用に標準化されていないという事実によるものではありません(少なくとも私の知る限り)。

このサイトは、コードの作成に役立ちます。 http://www.hand-interactive.com/resources/detect-mobile-javascript.htm

これを行うことにより、javascriptでユーザーエージェントを取得できます。

var uagent = navigator.userAgent.toLowerCase();

そして、これと同じ形式でチェックを行います(簡単な例としてiPhoneを使用しますが、他のものは少し異なる必要があります)

function DetectIphone()
{
   if (uagent.search("iphone") > -1)
      alert('true');
   else
      alert('false');
}

編集

次のような単純なHTMLページを作成します。

<html>
    <head>
        <title>Mobile Detection</title>
    </head>
    <body>
        <input type="button" OnClick="DetectIphone()" value="Am I an Iphone?" />
    </body>
</html>
<script>
    function DetectIphone()
    {
       var uagent = navigator.userAgent.toLowerCase();
       if (uagent.search("iphone") > -1)
          alert('true');
       else
          alert('false');
    }
</script>
26
slandau

非常に簡単な解決策は、画面の幅を確認することです。ほとんどのモバイルデバイスの最大画面幅は480px(現在)であるため、非常に信頼性が高くなります。

if( screen.width <= 480 ) {
    location.href = '/mobile.html';
}

ユーザーエージェント文字列は、見る場所でもあります。ただし、前者のソリューションの方が優れています。これは、何らかの異常なデバイスがユーザーエージェントに対して正しく応答しない場合でも、画面の幅が嘘をつかないためです。

ここでの唯一の例外は、iPadのようなタブレットPCです。これらのデバイスはスマートフォンよりも画面幅が広いので、おそらくそれらにはuser-agent-stringを使用します。

20
jAndy
if(navigator.userAgent.match(/iPad/i)){
 //code for iPad here 
}

if(navigator.userAgent.match(/iPhone/i)){
 //code for iPhone here 
}


if(navigator.userAgent.match(/Android/i)){
 //code for Android here 
}



if(navigator.userAgent.match(/BlackBerry/i)){
 //code for BlackBerry here 
}


if(navigator.userAgent.match(/webOS/i)){
 //code for webOS here 
}
14
var isMobileDevice = navigator.userAgent.match(/iPad|iPhone|iPod/i) != null 
    || screen.width <= 480;
8
kolypto

簡単な解決策はCSSのみです。スタイルシートでスタイルを設定し、その下部でスタイルを調整できます。最近のスマートフォンは、幅がわずか480ピクセルのように動作しますが、実際にはもっと広いです。 cssで小さい画面を検出するコードは

@media handheld, only screen and (max-width: 560px), only screen and (max-device-width: 480px)  {
    #hoofdcollumn {margin: 10px 5%; width:90%}
}

お役に立てれば!

6
Ivotje50

現在は2015年なので、この質問に出くわした場合は、おそらく window.matchMedia を使用する必要があります(さらに、2015年の場合は、古いブラウザーでは polyfilling ):

if (matchMedia('handheld').matches) {
    //...
} else {
    //...
}
5
Chris Devereux

だから私はこれをやった。皆さん、ありがとうございました!

<head>
<script type="text/javascript">
    function DetectTheThing()
    {
       var uagent = navigator.userAgent.toLowerCase();
       if (uagent.search("iphone") > -1 || uagent.search("ipad") > -1 
       || uagent.search("Android") > -1 || uagent.search("blackberry") > -1
       || uagent.search("webos") > -1)
          window.location.href ="otherindex.html";
    }
</script>

</head>

<body onload="DetectTheThing()">
VIEW NORMAL SITE
</body>

</html>
4
CSepúlveda

mobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent)を使用します

4
individuo7

ユーザーエージェント文字列を使用して、これを検出できます。

var useragent = navigator.userAgent.toLowerCase();

if( useragent.search("iphone") )
    ; // iphone
else if( useragent.search("iPod") )
    ; // iPod
else if( useragent.search("Android") )
    ; // Android
etc

ここでユーザーエージェント文字列のリストを見つけることができます http://www.useragentstring.com/pages/useragentstring.php

3
tskuzzy

チェックアウトすることをお勧めします 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を使用していることを前提としています)、次のようなことができるようになります。

WURFL.complete_device_name

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

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

3
Luca Passani

これは、ウェブページがデスクトップアプリまたはモバイルアプリに読み込まれているかどうかを確認する方法の例です。

JSはページのロード時に実行され、バーコードスキャナーを非表示にするなど、ページのロード時にデスクトップ固有の操作を実行できます。

   <!DOCTYPE html>
    <html>
    <head>
     <script type="text/javascript">

            /*
            * Hide Scan button if Page is loaded in Desktop Browser
            */
            function hideScanButtonForDesktop() {

                if (!(/Android|webOS|iPhone|iPad|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|Opera Mini/i.test(navigator.userAgent))) {

                    // Hide scan button for Desktop
                    document.getElementById('btnLinkModelScan').style.display = "none";
                }         
            }

            //toggle scanButton for Desktop on page load
            window.onload = hideScanButtonForDesktop;
        </script>
    </head>
2
Hitesh Sahu

シミュレートする必要があるデバイスのユーザーエージェントが何であるかを判断し、それに対して変数をテストします。

例えば:

// var userAgent = navigator.userAgent.toLowerCase(); // this would actually get the user agent

var userAgent = "iphone"; /* Simulates User Agent for iPhone */
if (userAgent.indexOf('iphone') != -1) {
   // some code here
}
1
Inversus

DeviceDetection を使用するだけです

deviceDetection.deviceType // phone | tablet according to device
0
Manjesh V

ハックの適切な解決策を探して(成功しなかったように)、それでもここにハックを追加したいと思います。モバイルとデスクトップの最も大きな違いと思われるデバイスの向きのサポートを確認するだけです。

var is_handheld = 0; //単なるグローバルif(window.DeviceOrientationEvent){is_handheld = 1;}

そうは言っても、ページはモバイル/デスクトップレイアウトの手動選択を提供する必要があります。私は1920 * 1080を取得し、ズームインすることができます-単純化され機能が削減されたwordpressoidチャンクは必ずしも良いことではありません。特に、非稼働デバイスの検出に基づいてレイアウトを強制する-それは常に発生します。

0
dd_1138

別の可能性は、 mobile-detect.js を使用することです。 デモ を試してください。

ブラウザの使用:

<script src="mobile-detect.js"></script>
<script>
    var md = new MobileDetect(window.navigator.userAgent);
    // ... see below
</script>

Node.js/Express:

var MobileDetect = require('mobile-detect'),
    md = new MobileDetect(req.headers['user-agent']);
// ... see below

例:

var md = new MobileDetect(
    'Mozilla/5.0 (Linux; U; Android 4.0.3; en-in; SonyEricssonMT11i' +
    ' Build/4.1.A.0.562) AppleWebKit/534.30 (KHTML, like Gecko)' +
    ' Version/4.0 Mobile Safari/534.30');

// more typically we would instantiate with 'window.navigator.userAgent'
// as user-agent; this string literal is only for better understanding

console.log( md.mobile() );          // 'Sony'
console.log( md.phone() );           // 'Sony'
console.log( md.tablet() );          // null
console.log( md.userAgent() );       // 'Safari'
console.log( md.os() );              // 'AndroidOS'
console.log( md.is('iPhone') );      // false
console.log( md.is('bot') );         // false
console.log( md.version('Webkit') );         // 534.3
console.log( md.versionStr('Build') );       // '4.1.A.0.562'
console.log( md.match('PlayStation|xbox') ); // false
0
BuZZ-dEE

これは私のバージョンで、上のバージョンと非常に似ていますが、参考にすると思います。

if (mob_url == "") {
  lt_url = desk_url;
} else if ((useragent.indexOf("iPhone") != -1 || useragent.indexOf("Android") != -1 || useragent.indexOf("Blackberry") != -1 || useragent.indexOf("Mobile") != -1) && useragent.indexOf("iPad") == -1 && mob_url != "") {
  lt_url = mob_url;
} else {
  lt_url = desk_url;
}
0
Parker LAU

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

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

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

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

0
jcubic

上記のいくつかの答えに似ています。この単純な関数は、私にとって非常にうまく機能します。 2019年現在

function IsMobileCard()
{
var 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;   
}
0
Debbie Kurth

ユーザーエージェントのテストは複雑で煩雑で、常に失敗します。また、「ハンドヘルド」のメディアマッチが私のために機能していることもわかりませんでした。最も簡単な解決策は、マウスが使用可能かどうかを検出することでした。そして、それは次のように行うことができます:

var result = window.matchMedia("(any-pointer:coarse)").matches;

ホバーアイテムを表示する必要があるかどうか、および物理ポインターを必要とするその他のものを表示します。その後、幅に基づいてさらにメディアクエリでサイジングを実行できます。

次の小さなライブラリは、上記のクエリのベルトブレースバージョンで、ほとんどの「マウスのないタブレットまたは携帯電話」シナリオをカバーするはずです。

https://patrickhlauke.github.io/touch/touchscreen-detection/

メディアの一致は2015年以降サポートされており、互換性はこちらで確認できます: https://caniuse.com/#search=matchMedia

つまり、画面がタッチスクリーンかどうか、および画面のサイズに関連する変数を維持する必要があります。理論的には、マウス操作のデスクトップに小さな画面を置くことができます。

0
PeterS