【问题标题】:How to detect a mobile device with JavaScript?如何使用 JavaScript 检测移动设备?
【发布时间】:2011-07-12 15:37:19
【问题描述】:

我被要求创建一个实际的 HTML 页面/JavaScript 来模拟使用 JavaScript 代码检测移动设备(iPhone / iPad / Android)。然后,这会将用户带到另一个屏幕,询问他们的电子邮件地址。

【问题讨论】:

标签: javascript html mobile device


【解决方案1】:

我知道这个答案迟到了 3 年,但没有其他答案确实是 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.
}

【讨论】:

  • 我也会添加关键字“Mobile”。
  • 您需要某种库吗?我怀疑是不是这么简单。
【解决方案2】:

您将检测请求浏览器的用户代理字符串,然后根据它是否来自移动浏览器来决定它是什么。这个设备并不完美,而且永远不会因为用户代理没有针对移动设备进行标准化(至少据我所知不是这样)。

本站将帮助您创建代码: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>

【讨论】:

  • 但我想知道什么是开始?创建一个虚拟网页并将此编码嵌入其中。是不是我们将使用的html,因为正如我在上面的代码中提到的,我没有什么可开始的。
  • 太棒了!!!!感谢那。如何将其重定向到不同的页面。你认为这样的事情会有帮助吗? if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i)) || (navigator.userAgent.match(/Android/i))) { if (文档.cookie.indexOf("iphone_redirect=false") == -1) window.location = "m.espn.go.com/wireless/?iphone&i=COMR";
  • 不要忘记用户代理可以更改、欺骗并且可能无法反映当前浏览器。话虽如此,如果客户欺骗/更改了他们的 UserAgent 并且您显示错误的视图是他们自己的错。尽管用户代理通常是所有检测的根源,但除了纯用户代理之外还有其他方法。这里有一个非常好的(虽然已经过时)示例github.com/ahand/mobileesp?files=1
  • 聪明——从没想过:D
【解决方案3】:

一个非常简单的解决方案是检查屏幕宽度。由于几乎所有移动设备的最大屏幕宽度为 480 像素(目前),因此非常可靠:

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

用户代理字符串也是一个可以查看的地方。但是,前一种解决方案仍然更好,因为即使某些该死的设备没有正确响应用户代理,屏幕宽度也不会说谎。

这里唯一的例外是平板电脑,例如 ipad。这些设备的屏幕宽度比智能手机高,我可能会使用用户代理字符串。

【讨论】:

  • 对!!我只需要检测 iPhone 或 Android。所以这不应该是一个问题,只是为了让你知道我绝对没有什么可开始的。我应该创建一个虚拟网页并嵌入它!另外如何检查检测?我需要将脚本传输到手机吗?
  • 我的,屏幕宽度是如何变化的 ;)
【解决方案4】:
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 
}

【讨论】:

  • 这是最好最干净的解决方案
  • 即使这段代码不会执行超过一个块,因为它一遍又一遍地检查一件事,由于这个原因,这段代码应该使用 else-if 块。此外,如果用户代理变量在块之间以某种方式发生变化怎么办?它会在这里执行超过 1 个块。
  • 你是对的,别忘了 4 年前的代码 :) 现在有更好的工具或方法来做同样的工作
【解决方案5】:
var isMobileDevice = navigator.userAgent.match(/iPad|iPhone|iPod/i) != null 
    || screen.width <= 480;

【讨论】:

  • +1 用于正则表达式匹配,允许用户一次轻松检查多个设备。但是,为了清楚起见,我要补充一点,因为您在正则表达式的末尾表示 /i 以进行不敏感匹配,因此实际上不需要将搜索参数设为驼峰式。以下将是等效的(并且还搜索 android 设备): .match(/ipad|iphone|ipod|android/i)
【解决方案6】:

一个简单的解决方案可能是纯 CSS。您可以在样式表中设置样式,然后在其底部进行调整。现代智能手机看起来只有 480 像素宽,但实际上要宽得多。在 css 中检测小屏幕的代码是

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

希望这会有所帮助!

【讨论】:

    【解决方案7】:

    我用mobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent)

    【讨论】:

      【解决方案8】:

      所以我这样做了。谢谢大家!

      <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>
      

      【讨论】:

        【解决方案9】:

        现在是 2015 年,如果您偶然发现这个问题,那么您可能应该使用 window.matchMedia(如果仍然是 2015 年,对于旧浏览器,polyfilling):

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

        【讨论】:

        • 这在运行 Firefox 的 Nexus 5 上对我不起作用。
        • 来自MDN 的注释 注意:CSS2.1 和媒体查询 3 定义了几种额外的媒体类型(tty、tv、投影、手持、盲文、浮雕、听觉),但它们已被弃用在媒体查询 4 ​​中,不应使用。
        • 在下面查看我的答案,出于某种原因,手持设备也不适合我。
        【解决方案10】:

        您可以使用用户代理字符串来检测这一点。

        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

        【讨论】:

          【解决方案11】:

          我建议您查看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
          

          这就是你要找的。​​p>

          免责声明:我为提供这项免费服务的公司工作。谢谢。

          【讨论】:

          • “您可以免费使用这些服务,只要您的网站是公开的并且不需要付费或付费订阅即可访问。” -web.wurfl.io/#wurfl-js
          【解决方案12】:

          这是一个如何检查网页是否在桌面或移动应用中加载的示例。

          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>
          

          【讨论】:

            【解决方案13】:

            确定您需要模拟的设备的用户代理是什么,然后针对它测试一个变量。

            例如:

            // 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
            }
            

            【讨论】:

            • !!~userAgent.indexOf('iphone') // &gt;&gt; true|false
            【解决方案14】:

            基于用户代理的设备检测不是很好的解决方案,更好的是检测触摸设备等功能(在新的jQuery中,他们删除了$.browser并改用$.support)。

            要检测移动设备,您可以检查触摸事件:

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

            取自What's the best way to detect a 'touch screen' device using JavaScript?

            【讨论】:

            • 投反对票,因为 OP 要求使用移动设备。对于现在的触摸屏笔记本电脑,“触摸设备”并不是一个很好的解决方案。
            • @thebrenny 笔记本电脑是移动设备,它们可以轻松地从一个地方移动到另一个地方
            • 天哪,我有一些笔记本电脑在便携方面毫无用处! ? 但无论哪种方式,OP 都以 iPhone、iPad 和 Android 作为他们想要检测的示例,而“mobile”是“mobile phone”的缩写。可能更好的描述是“无键盘”
            【解决方案15】:

            查找设备类型最简洁的方法是:

            if (navigator.userAgentData.mobile) { // do something }
            

            (虽然 Safari 尚不支持)

            更多信息:https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData/mobile

            【讨论】:

            • 有趣的是,这个功能在 FF 上不可用,即使我们有这个 mdn 链接。
            【解决方案16】:

            这是我的版本,和上面的差不多,不过我觉得还是可以参考的。

            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;
            }
            

            【讨论】:

              【解决方案17】:

              只需使用DeviceDetection

              deviceDetection.deviceType // phone | tablet according to device
              

              【讨论】:

              • 你为他们工作吗?这实际上只是使用了用户代理
              【解决方案18】:

              另一种可能性是使用mobile-detect.js。试试demo

              浏览器使用:

              <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
              

              【讨论】:

                【解决方案19】:

                当我(有点没有成功)为我的 hack 寻找合适的解决方案时,我仍然想在这里添加我的 hack:我只是检查设备方向的支持,这似乎是手机和桌面之间最显着的差异:

                var is_handheld=0; // 只是一个全局的 if(window.DeviceOrientationEvent) {is_handheld=1;}

                话虽如此,恕我直言,页面还应该提供移动/桌面布局之间的手动选择。我得到了 1920*1080 并且可以放大 - 过度简化和功能减少的 wordpressoid 块并不总是一件好事。尤其是强制基于非工作设备检测的布局 - 它一直在发生。

                【讨论】:

                  【解决方案20】:

                  对用户代理的测试是复杂的、混乱的并且总是失败的。 我也没有发现“手持”的媒体匹配对我有用。最简单的解决方案是检测鼠标是否可用。可以这样做:

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

                  这将告诉您是否需要显示悬停项目以及其他任何需要物理指针的内容。然后可以根据宽度对进一步的媒体查询进行大小调整。

                  下面的小库是上面查询的一个大括号版本,应该涵盖大多数“你是平板电脑还是没有鼠标的手机”的场景。

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

                  自 2015 年以来一直支持媒体匹配,您可以在此处查看兼容性: https://caniuse.com/#search=matchMedia

                  简而言之,您应该维护与屏幕是否为触摸屏以及屏幕尺寸相关的变量。理论上,我可以在鼠标操作的桌面上拥有一个小屏幕。

                  【讨论】:

                  • 如果您尝试确定是否显示悬停项目,您不应该使用媒体查询(hover) 来代替吗?
                  • @SpoonMeiser 我的意思是即使设备支持悬停,我也需要一个可以悬停的设备。如果我没有指针,我就无法悬停。
                  • IIUC 悬停表示主输入设备支持悬停,指针支持,但触摸屏不支持
                  【解决方案21】:

                  类似于上面的几个答案。这个简单的功能对我来说效果很好。它是截至 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;   
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-04-07
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-08-30
                    • 2015-01-06
                    • 2023-03-05
                    相关资源
                    最近更新 更多