如何使用JavaScript检测移动设备?


78

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


如果您可以通过这种方式知道屏幕尺寸,则可以区分iPhone和iPad
lovesh 2011年

1

Answers:


82

我知道这个答案即将到来晚了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.
}

1
我还要添加关键字“移动”。
基拉伊伊什特万

3
您需要某种图书馆吗?我怀疑这很简单。

28

您将检测到发出请求的浏览器用户代理字符串,然后根据它是什么来决定是否来自移动浏览器。该设备不是完美的,并且永远不会由于用户代理没有针对移动设备而标准化的事实(至少据我所知)。

该站点将帮助您创建代码: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吗,因为正如我在上面的代码中提到的那样,我一无所有。
Jeevs 2011年

大!!!!感谢那。如何将其重定向到其他页面。您认为这样的事情会有所帮助吗?if((navigator.userAgent.match(/ iPhone / i))||(navigator.userAgent.match(/ iPod / i))||(navigator.userAgent.match(/ Android / i))){如果(文档.cookie.indexOf(“ iphone_redirect = false”)== -1)window.location =“ m.espn.go.com/wireless/?iphone&i=COMR ”;
Jeevs

1
不要忘记,用户代理可以更改,被欺骗并且可能无法反映当前的浏览器。话虽这么说,如果客户端欺骗/更改了他们的UserAgent,而您却看到了错误的视图,那是他们自己的错。尽管纯用户代理通常是所有检测的根源,但还有其他方法。github.com/ahand/mobileesp?files=1
Nico

聪明-没想到:D
星尘

22

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

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

用户代理字符串也是一个查找的地方。但是,前一种解决方案仍然更好,因为即使某些乱码设备无法正确响应用户代理,屏幕宽度也不存在。

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


对!!我只需要检测iPhone或Android。因此,这应该不成问题,而只是让您知道我一无所有。我应该创建一个虚拟网页并将其嵌入!还有如何检查检测?我需要将脚本传输到手机吗?
Jeevs 2011年

13
我的萤幕宽度已如何改变;)
Josh Noe

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

这是最好,最干净的解决方案
eluleci 2014年

2
即使此代码不会执行一个以上的块,因为它会一遍又一遍地检查一件事,但由于这个原因,该代码应使用else-if块。另外,如果用户代理变量在块之间以某种方式更改怎么办?在这里,它将执行1个以上的块。
杰克·米林顿

您是对的,请不要忘记该代码是4年前的:),现在有更好的工具或方法可以完成相同的工作
Ahmed Abu Eldahab

8
var isMobileDevice = navigator.userAgent.match(/iPad|iPhone|iPod/i) != null 
    || screen.width <= 480;

2
+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%}
}

希望这可以帮助!


5

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


5

所以我做到了。谢谢你们!

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

5

由于现在是2015年,因此如果您偶然发现了这个问题,那么您可能应该使用window.matchMedia(如果仍然是2015年,请为旧版浏览器进行polyfilling):

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

在运行Firefox的Nexus 5上,这对我不起作用。
拉斐尔

2
来自MDN的 注释注意:CSS2.1和Media Queries 3定义了几种其他媒体类型(tty,tv,投影,手持,盲文,浮雕,听觉),但Media Queries 4中已弃用它们,不应使用它们。
PaulCo '16

请参阅下面的答案,由于某种原因,掌上电脑也不适合我。
PeterS

3

您可以使用用户代理字符串进行检测。

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

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

这就是您要寻找的。

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


“只要您的网站是公开可用的,并且不需要付费或付费订阅,您就可以免费使用这些服务。” - web.wurfl.io/#wurfl-js
埃克塞尔甘博亚

2

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

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>

1

确定您需要模拟的设备的用户代理,然后针对该代理测试变量。

例如:

// 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') // >> true|false
科迪

0

这是我的版本,与上一个版本非常相似,但我认为值得参考。

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

基于用户代理的设备检测不是一个很好的解决方案,更好的方法是检测触摸设备之类的功能(在新的jQuery中,它们已删除$.browser$.support改为使用)。

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

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

摘自使用JavaScript检测“触摸屏”设备的最佳方法是什么?


投反对票,因为OP要求使用移动设备。对于当今的触摸屏笔记本电脑,“触摸设备”并不是一个很好的解决方案。
TheBrenny 2015年


0

另一种可能性是使用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

当我(有点没有成功)为我的黑客寻找合适的解决方案时,我还是想在这里添加我的黑客:我只是检查对设备方向的支持,这似乎是手机和台式机之间最大的区别:

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

话虽如此,恕我直言页面也应该提供移动/桌面布局之间的手动选择。我的分辨率为1920 * 1080,可以放大-过于简化且功能减少的wordpressoid块并不总是一件好事。尤其是基于无法正常工作的设备检测强制进行布局-它始终在发生。


0

对用户代理的测试非常复杂,混乱并且总是失败。我也没有发现“掌上电脑”的媒体匹配对我有用。最简单的解决方案是检测鼠标是否可用。可以这样完成:

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

这将告诉您是否需要显示悬停项目以及需要物理指针的其他任何内容。然后可以基于宽度在其他媒体查询上完成大小调整。

下面的小程序库是上面查询的大括号版本,应涵盖大多数“您是没有鼠标的平板电脑还是手机”方案。

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

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

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


如果要确定是否显示悬停项目,是否应该使用媒体查询(hover)
SpoonMeiser

@SpoonMeiser我的观点是,即使设备支持悬停,我也需要可以悬停的设备。如果没有指针,则无法悬停。
-PeterS,

IIUC悬停意味着主要输入设备支持悬停,指针可以支持但触摸屏不支持
SpoonMeiser

0

与以上几个答案相似。这个简单的功能对我来说很好用。截至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;   
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.