如何使用jQuery检测移动设备

How to detect a mobile device using jQuery

提问人: 提问时间:8/19/2010 最后编辑:9 revs, 8 users 40%superUntitled 更新时间:10/28/2023 访问量:1938529

问:

有没有办法检测用户是否在jQuery中使用移动设备?类似于 CSS 属性的东西?如果浏览器在手持设备上,我想运行不同的脚本。@media

jQuery函数不是我要找的。$.browser

JavaScript jQuery 移动 浏览器检测

评论

8赞 user229044 8/19/2010
提供专门用于移动设备的移动 URL。这是大多数主要网站处理移动设备的方式。请参见 m.google.com
6赞 Yi Jiang 8/22/2010
jQuery没有,也不能做所有事情。它提供了跨浏览器的 DOM 遍历和操作、浏览器之间的简单动画和 ajax,并为插件创建了一个框架框架。在专门询问jQuery解决方案之前,请注意jQuery的局限性。
87赞 Rob 1/9/2012
用户代理是不断移动的目标,阅读这篇文章的每个人都应该非常警惕用户代理嗅探
57赞 David Gilbertson 7/9/2013
什么是“移动”设备?它是否支持触摸(包括 Chrome Pixel 和带鼠标的 Windows 8 笔记本电脑)?它是小屏幕的设备(视网膜 iPad 呢)?是CPU速度慢的设备吗?还是互联网连接速度较慢的设备?根据你想做什么,这个问题的答案会有所不同。目标屏幕分辨率或触摸很容易。如果你想为某些设备提供较小的内容或不太密集的 JS,那么就没有灵丹妙药了。测试 window.navigator.connection 并回退到(讨厌的、糟糕的、不明智的)userAgent 嗅探。我的 2 美分。
6赞 David Gilbertson 8/20/2013
@Cole“Cole9”Johnson:我的观点正是如此。“移动”似乎被用作触摸、CPU慢、网络慢和小屏幕的总称。但这些都不是完美的假设。我相信,单独考虑这些将产生比设计一些模糊的“移动”概念更好的产品。因此,我向OP提出了这个问题。

答:

74赞 2 revs, 2 users 84%Ender #1

这不是jQuery,但我发现了这个:http://detectmobilebrowser.com/

它提供了多种语言的脚本来检测移动浏览器,其中一种是 JavaScript。这可能会帮助您找到所需的内容。

但是,由于您使用的是 jQuery,因此您可能希望了解 jQuery.support 集合。它是用于检测当前浏览器功能的属性集合。文档在这里:http://api.jquery.com/jQuery.support/

由于我不知道您到底要完成什么,因此我不知道其中哪一个最有用。

话虽如此,我认为您最好的选择是使用服务器端语言重定向或编写不同的脚本到输出(如果这是一个选项)。由于您并不真正了解移动浏览器 x 的功能,因此在服务器端进行检测和更改逻辑将是最可靠的方法。当然,如果你不能使用服务器端语言:)所有这些都是没有意义的

评论

14赞 cprcrack 8/3/2013
那里有一个jQuery版本,它可以完美地工作,但是对于平板电脑检测,您必须按照关于部分中的说明进行添加(这是设计使然)|android|ipad|playbook|silk
12赞 MoDFoX #2

如果您不是特别担心小型显示器,则可以使用宽度/高度检测。这样,如果宽度低于一定大小,移动网站就会被抛出。这可能不是完美的方法,但它可能是最容易检测多个设备的方法。您可能需要为 iPhone 4(高分辨率)安装特定的。

2307赞 20 revs, 18 users 27%sweets-BlingBling #3

编者按:对于现代 Web 应用,不推荐使用用户代理检测技术。请参阅此答案下方的评论以确认这一事实。建议使用功能检测和/或媒体查询的其他答案之一。


您可以使用简单的 JavaScript 来检测它,而不是使用 jQuery:

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"

注意:在 jQuery v1.9.1 上删除。但是你可以通过使用jQuery迁移插件代码来使用它$.browser


更彻底的版本:

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

评论

1赞 A.Anvarbekov 4/15/2022
我们可以使用吗?navigator.userAgentData.mobile
0赞 Piyush 6/1/2022
不。它在 firefox 中不起作用。UserAgentData 在 FF 中未定义。
1赞 Jake 1/28/2023
请在 2023 年不要尝试为手机创建单独版本的网站。相反,请使用要素检测来确定输入机制和视口大小。无论如何,User-Agent 嗅探是一个糟糕的解决方案,而且不是面向未来的。
1赞 Andreas moved to Codidact 5/30/2023
@Jake 在这里保留这个答案是很有用的,因为它解释了为什么在历史上,这个解决方案被选中,以及它的起始说明,为什么要避免这个解决方案,如果有人后来认为这是一个好主意。删除答案,你就有可能让某人后来发现这是设计他们网站的好方法。不过,它应该未标记为正确答案。请大家对其他答案投赞成票。
3赞 Andreas moved to Codidact 5/30/2023
@Jake 也;我看到您在多个答案上粘贴了相同的两条评论。这并不是很有帮助。请改为提供指向正确解决方案的链接。无休止地滚动浏览答案,阅读“这是一个令人震惊的解决方案;使用特征检测“不是那么有用。解释如何使用特征检测的答案在哪里?为什么这些其他答案还不够?它们什么时候不起作用?
50赞 2 revs, 2 users 97%genkilabs #4

有时,需要知道客户正在使用哪个品牌的设备,以便显示特定于该设备的内容,例如指向 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/

19赞 3 revs, 3 users 87%Ben H #5

你不能依赖,并不是每个设备都能显示其真正的操作系统。例如,在我的HTC上,这取决于设置(“使用移动版本”打开/关闭)。 在 http://my.clockodo.com 上,我们只是用来检测小型设备。不幸的是,在某些 Android 版本中,screen.width 存在错误。您可以通过这种方式与 userAgent 结合使用:navigator.userAgentscreen.width

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

评论

10赞 oriadam 12/3/2015
许多手机的宽度为 >1000,尤其是在横向模式下
5赞 Jonathon Hill #6

您可以使用以下函数来获取有关您是否在移动浏览器上运行的真/错答案。是的,它是浏览器嗅探,但有时这正是您所需要的。

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

评论

1赞 robocat 9/13/2012
这将无法检测到许多移动浏览器,尤其是移动 Chrome。它也可能会在某些方面失败:Opera Mobile、Firefox mobile、Opera Mini、各种流行的中国移动浏览器等。
0赞 oriadam 12/3/2015
你不需要这个!+您忘记创建正则表达式。下面是一个更简单的方法:forreturn !!navigator.userAgent.match(new RegExp(agents.join('|'),'i'))
2赞 Fran #7
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();
  }
};

我过去使用过这样的东西。这与之前的响应类似,但从技术上讲,它的性能更高,因为它会缓存匹配结果,尤其是在动画、滚动事件等中使用检测时。

评论

0赞 reformed 9/21/2017
为什么需要在动画/滚动事件等中调用此代码?
7赞 Safran Ali #8

看看这篇文章,它提供了一个非常好的代码片段,说明当检测到触摸设备时该怎么做,或者如果调用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();
}

评论

0赞 robocat 9/13/2012
'ontouchstart' in document.documentElement可能是比 更好的触摸支持测试。更好的是,使用Modernizr.js(modernizr.com),因为花了很多心思试图正确地进行触摸检测。如果您查看开发代码并搜索“触摸”,则可以在 modernizr.com/downloads/modernizr.js 中看到他们的触摸检测代码。window.Touch
3赞 JWarner 5/3/2014
触摸检测给我带来了麻烦,因为一些新的 Windows 8 笔记本电脑在 Chrome 中检测为触摸屏,导致奇怪的结果。
9赞 3 revs, 3 users 70%Victor Juri #9

很好的回答,谢谢。对支持 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";
}

评论

0赞 MeanMatt 3/1/2012
如果您尝试处理移动设备的悬停/拖动事件,我会说这是最简单(也许不是最好)的修复程序。我使用类似的东西来创建一个“isMobile”布尔值,然后检查每个悬停/鼠标悬停事件。反正那是我的两分钱。添加更多需要用户交互的 js 库或代码对我来说没有太大意义;如果我错了,请纠正我。
5赞 foobarbecue 8/11/2019
既然你使用的是正则表达式,那就实际使用它们:if (navigator.userAgent.match(/Android|webOS|iPhone|iPad|etc/)){self.location = "top.htm"}
661赞 11 revs, 11 users 63%Gonçalo Peres #10

对我来说,小即是美,所以我使用这种技术:

在 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媒体查询会根据屏幕尺寸显示/隐藏元素。

例如,在我的移动版本中,我不想激活 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。 与其使用上述解决方案,不如使用以下方法:

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

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

浏览器支持:http://caniuse.com/#feat=matchmedia

这种方法的优点是它不仅更简单、更短,而且如有必要,您可以有条件地分别定位不同的设备,例如智能手机和平板电脑,而无需在 DOM 中添加任何虚拟元素。

评论

85赞 merv 11/9/2012
-1 screen.width 属性是全局属性。没有必要随意地向 DOM 添加元素,也不必要地引入 CSS 媒体查询。另外,如果浏览器位于桌面上并且用户调整窗口大小,则不会更新。$is_mobile
130赞 andrewrjones 1/20/2013
为什么不呢:if( screen.width <= 480 ) { // is mobile }
95赞 Paul Irish 2/27/2014
您刚刚重新发明了 : developer.mozilla.org/en-US/docs/Web/API/Window.matchMediawindow.matchMedia
0赞 The concise 2/19/2022
如果将 bootstrap/jquery 技术放在函数中,则非常好。只需在屏幕方向更改或尺寸更改时调用即可。
0赞 Zach 12/23/2022
这在横向模式(Pixel 5、Firefox 和 Chrome)中会中断。我建议这样编辑它:window.matchMedia('only screen and ((max-width: 767px) or (max-height: 767px))').matches
4赞 2 revs, 2 users 92%Yene Mulatu #11

我用这个

if(navigator.userAgent.search("mobile")>0 ){
         do something here
}
32赞 Chris Moschini #12

如果“移动”是指“小屏幕”,我使用这个:

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

在 iPhone 上,您最终会得到 320 的 window.screen.width。在 Android 上,您最终会得到 480 的 window.outerWidth(尽管这可能取决于 Android)。iPad 和 Android 平板电脑将返回 768 等数字,因此它们将获得您想要的完整视图。

评论

1赞 Sreenikethan I 2/5/2023
windowWidth可以设置为使其更易于阅读。Math.min(window.screen.width, window.outerWidth)
-4赞 2 revs, 2 users 78%teknopaul #13

如果要测试用户代理,正确的方法是,测试用户代理,即测试。navigator.userAgent

如果这是假的,他们就不值得关注了。如果你,你以后不必担心系统是否是Unix。usertest.isUnix()

作为用户,更改 userAgent 也可以,但如果您这样做,您不希望网站正确呈现。

如果您希望为 Microsoft 浏览器提供支持,则应确保内容的前几个字符包含并测试您编写的每个页面。

底线。。。始终按照标准进行编码。然后破解它,直到它在当前版本的IE中工作,不要指望它看起来不错。这就是 GitHub 所做的,他们刚刚获得了 1 亿美元。

评论

0赞 Jake 2/6/2023
请使用功能检测,不要测试 .User-Agent
1赞 Pawel Dubiel #14

您还可以使用服务器端脚本并从中设置 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>

评论

0赞 Jake 2/6/2023
您在服务器端获得的唯一线索是 HTTP .这是一些随机字符串,你无法证明它的未来。从根本上说,这是错误的方法,应该不鼓励使用这个建议的库。此外,设备不应分为“移动”、“平板电脑”或“台式机”。大手机或小平板电脑呢?请使用特征检测。User-Agent
47赞 Gabriel #15

在以下位置找到了解决方案: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...
}
12赞 2 revs, 2 users 92%Mark #16

如果发现,仅仅检查并不总是可靠的。通过检查 可以实现更高的可靠性。对先前答案的简单修改似乎效果更好:navigator.userAgentnavigator.platform

if (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ||
   (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.platform))) {
    // some code...
}
1赞 2 revs, 2 users 94%arikan #17

此外,我建议使用微小的 JavaScript 库 Bowser,是的,没有 r。它基于所有浏览器,包括 iPhone、Android 等,并经过了很好的测试。navigator.userAgent

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

评论

0赞 Jake 2/6/2023
请停止推荐这个。
1赞 2 revs, 2 users 97%Nur Rony #18

您也可以像下面这样检测它

$.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"));
};

评论

0赞 Jake 2/6/2023
请用户功能检测。
9赞 2 revs, 2 users 93%dotTutorials #19

为了增加一个额外的控制层,我使用 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
    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;
}

评论

1赞 Gruber 6/2/2013
您基于 localStorage 的假设非常有趣,您能否提供一系列与您的脚本正确匹配的受支持设备或浏览器?我有兴趣为我提出的这个问题找到解决方案,尝试检测移动平板电脑浏览器确实是一个有趣的解决方法
6赞 NCoder #20

使用这个:

/**  * 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!');
}
16赞 2 revsPeterPan #21

如果您使用 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)

另请注意,测试用户代理将为您提供比 更广泛的检测到的 Microsoft 移动设备。iemobileWindows Phone

另请参阅此 SO 问题

评论

0赞 Kai Sellgren 8/2/2013
在 Dart 中也是如此:.TouchEvent.supported
0赞 JVE999 6/18/2014
('ontouchstart' in window)也是 hacks.mozilla.org/2013/04/ 的替代品......Modernizr.touch
0赞 oriadam 12/3/2015
你真的应该使用正则表达式,而不是许多匹配项。你也不需要,因为你有修饰符。这里:|toLowerCase()ivar isTouchDevice = Modernizr.touch || /iphone|ipod|ipad|android|iemobile|iphone|ipad|ipod|blackberry|bada/i.test(navigator.userAgent);
3赞 2 revs, 2 users 96%user172163 #22

这是我在项目中使用的代码:

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

评论

0赞 Jake 2/6/2023
请使用特征检测,而不是嗅探。User-Agent
3赞 2 revsAlbert #23

我尝试了一些方法,然后我决定手动填写列表并进行简单的 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;

现在,如果你想使用jQuery来设置CSS,你可以执行以下操作:

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

由于移动和固定设备之间的边界变得流畅,并且移动浏览器已经很强大,因此检查宽度和用户确认可能是未来最好的选择(假设在某些情况下宽度仍然很重要)。因为触摸已经转换为鼠标上下。

关于移动可移动性,我建议你考虑一下 Yoav Barnea 的想法

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

评论

1赞 zrooda 5/28/2014
任何一种需要用户确认的东西应该是内部的,而不是以任何方式打扰他,这是一个悲惨的用户体验细节。
14赞 4 revs, 2 users 88%Maksim Luzik #24

令我惊讶的是,没有人指出一个不错的网站: http://detectmobilebrowsers.com/ 它有不同语言的现成代码用于移动检测(包括但不限于):

  • 阿帕奇
  • ASP的
  • C#
  • IIS的
  • JavaScript的
  • NGINX的
  • PHP的
  • Perl的
  • 铁轨

如果您还需要检测平板电脑,只需检查“关于”部分以获取其他正则表达式参数。

Android 平板电脑、iPad、Kindle Fires 和 PlayBook 未被检测到 设计。要添加对平板电脑的支持,请添加到 第一个正则表达式。|android|ipad|playbook|silk

评论

0赞 Maksim Luzik 4/29/2014
对我来说,它正在工作,您能否更具体地说一下您使用什么代码以及哪里似乎有问题?
0赞 Rubén Ruíz 3/17/2018
该页面是响应,所有其他响应都是该页面的复制粘贴
0赞 Greg 7/16/2020
这些可能不是最新的(尽管我还没有验证),因为当我访问它时,该网站说:“正则表达式更新:2014 年 8 月 1 日”。
1赞 mohamed-ibrahim #25
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()
}

评论

0赞 Jake 2/6/2023
请不要使用嗅探。它不是面向未来的,你的网站会在你不做任何事情的情况下崩溃。请改用特征检测。User-Agent
109赞 4 revs, 2 users 72%sequielo #26

简单有效的一句话:

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

但是,上面的代码没有考虑到带触摸屏的笔记本电脑的情况。 因此,我根据@Julian解决方案提供第二个版本:

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

评论

38赞 Chris Cinelli 12/27/2013
带触摸屏的 Windows 笔记本电脑呢?
14赞 Luke 8/22/2015
您提供的第二个功能在我的 destop 设备上返回!!(谷歌浏览器 v44.0)isMobiletrue
22赞 Barkermn01 5/2/2016
这更像是一种 isTouchSupported 方法,而不是真正的移动检测。
5赞 lucasls #27

基于 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));
}
9赞 4 revs, 3 users 90%Luca Passani #28

我建议你看看 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();
}

这就是你要找的。

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

评论

0赞 Luca P. 4/3/2014
Nexus 7有些不对劲。您确定设置中没有 Nexus 欺骗 UA 字符串吗?就iPad mini而言,是的,这很难与其他iPad区分开来,但它仍然被认为是iPad,对吧?是你对我的帖子投了反对票吗?
0赞 Jacob 4/3/2014
否,ipad mini 被检测为桌面设备
2赞 Paolo Mioni #29

这似乎是一个全面的现代解决方案:

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

它可以检测多个平台、智能手机与平板电脑以及方向。它还将类添加到 BODY 标记中,因此检测只发生一次,您可以使用一系列简单的 jQuery hasClass 函数读取您正在使用的设备。

一探究竟...

[免责声明:我与写它的人没有任何关系。

评论

0赞 Anthony Hatzopoulos 9/14/2014
+1 表示小巧整洁的设备 .js。但我不会完全称它为“现代解决方案”,它的核心是使用用户代理嗅探。我也不会称它为“全面”,另一方面,ua-parser 是。
0赞 Jake 2/6/2023
请使用功能检测,而不是针对特定设备。
6赞 2 revsjcubic #30

所有答案都使用用户代理来检测浏览器,但基于用户代理的设备检测不是很好的解决方案,更好的是检测触摸设备等功能(在新的jQuery中,他们删除并使用)。$.browser$.support

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

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

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

评论

5赞 JustAMartin 5/20/2014
不幸的是,这并不可靠,无论如何它都会在带有触摸屏的台式 PC 上返回。stucox.com/blog/you-cant-detect-a-touchscreentrue
2赞 Mike Kormendy 7/13/2015
别忘了配备触摸屏和完整浏览器体验的笔记本电脑。:-)
0赞 Kathara 6/25/2019
这可能不是检查它是否是移动设备的方法,但正如您的函数名称所述,检查支持触摸的设备是完美的。+1 来自我 ;-)
295赞 6 revs, 3 users 82%Daniel Hanrahan #31

虽然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!
}

评论

15赞 Daniel Hanrahan 6/9/2016
链接的文章提到:如果设备足够大,没有标有“Mobi”,你应该为你的桌面网站提供服务(作为最佳实践,无论如何都应该支持触摸输入,因为越来越多的台式计算机出现了触摸屏)。
2赞 Jake 1/28/2023
请在 2023 年不要尝试为手机创建单独版本的网站。相反,请使用要素检测来确定输入机制和视口大小。无论如何,User-Agent 嗅探是一个糟糕的解决方案,而且不是面向未来的。
0赞 RiZKiT 7/5/2023
如果你需要支持“Opera Mini”(希望不是这样),那么你也必须在正则表达式中包含它,因为用户代理既不包含“Mobi”也不包含“Android”。
1赞 2 revs, 2 users 85%João Marcos Santos Teixeira #32

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

按平台名称筛选。

前任:

x = $( window ).width();

platform = navigator.platform;

alert(platform);

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


} 

^^

4赞 2 revs, 2 users 73%Luca Mori Polpettini #33

mobiledetect.net 怎么样?

其他解决方案似乎太基础了。这是一个轻量级的PHP类。它使用User-Agent字符串与特定的HTTP标头相结合来检测移动环境。您还可以通过使用任何第三方插件从Mobile Detect中受益:WordPress,Drupal,Joomla,Magento等。

评论

0赞 Craicerjack 4/10/2018
因为问题问的是jQuery?
0赞 oldboy 11/13/2020
PHP脚本的准确性如何?它比在客户端检测更准确吗?
31赞 3 revsJames Westgate #34

在一行 javascript 中:

var isMobile = ('ontouchstart' in document.documentElement && /mobi/i.test(navigator.userAgent));

如果用户代理包含“Mobi”(根据 MDN)并且 ontouchstart 可用,那么它很可能是移动设备。

编辑:更新正则表达式代码以响应评论中的反馈。使用正则表达式 i 使其不区分大小写,并且 mobi 匹配所有移动浏览器。查看 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox/mobi/i

0赞 2 revs, 2 users 80%Akshay Khale #35

结帐 http://detectmobilebrowsers.com/,它为您提供了用于检测各种语言的移动设备的脚本,包括

JavaScript、jQuery、PHP、JSP、Perl、Python、ASP、C#、ColdFusion 等等

评论

0赞 Jake 2/6/2023
请不要。请使用功能检测,而不是检测特定的设备类型。
22赞 2 revs, 2 users 97%Jacob King #36

我知道这个问题有很多答案,但据我所知,没有人能像我解决这个问题一样接近答案。

CSS 使用宽度(媒体查询)来确定基于宽度应用于 Web 文档的样式。为什么不在 JavaScript 中使用宽度?

例如,在 Bootstrap 的(移动优先)媒体查询中,存在 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

评论

0赞 Jeff Mergler 3/1/2016
这对我来说最有效。由于我对某些移动转发页面使用 bootstrap,因此这种技术可以很好地从非移动转发(非 bootstrap)自动重定向到引导页面。提示:我在 IE11 F12 工具中发现了一个小问题:我在移动设备的 F12 开发工具中打开了仿真,但它无法检测到窗口大小。我已将其大小调整到xs断点以下,但它将其检测为md。一旦我关闭模拟手机并刷新页面,它就正确地检测到了大小,并在我的代码中重定向到引导页面。
2赞 medBouzid 10/2/2017
@JacobKing你说这意味着它应该是(包括 991)与 1199 相同,它应该< 1200Small Devices range from 768 to 991 pixels.window.innerWidth < 992
-2赞 2 revs, 2 users 89%Mickey #37

我为我的 .NET 应用程序执行此操作。

在我共享的页面中,我添加了这个。_Layout.cshtml

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

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

然后检查您网站中的任何页面(jQuery):

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

评论

2赞 Andrew Lazarus 1/8/2016
恐怕这与jQuery无关
0赞 Jake 2/6/2023
它也与OP无关。
2赞 2 revs, 2 users 95%NikitOn #38

添加:

在某些版本的 iOS 9.x 中,Safari 不会在 中显示“iPhone”,而是在 中显示它。navigator.userAgentnavigator.platform

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

评论

0赞 Jake 2/6/2023
这应该无关紧要,因为您应该使用特征检测而不是嗅探。User-Agent
-1赞 4 revs, 2 users 71%Kareem #39

检查用户代理值。

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赞 Jake 2/6/2023
这是错误的方法,因此我们不会更新您的阵列。
0赞 Kareem 3/19/2023
@Jake我不知道我们是谁,也不知道你在说什么数组更新。无论操作系统版本如何,这都有效。
0赞 Jake 4/16/2023
我们就是我。如果你愿意考虑一下,你的解决方案是完全站不住脚的。你可能认为它现在有效,但也许你很天真。请只在你对手头的主题有很好的理解的地方发布答案。UA 字符串可以伪造,也可以通过浏览器工具进行设置。他们不会告诉你你在寻找什么。如果你是UA嗅探,你甚至不知道你自己在寻找什么。
0赞 Jake 4/26/2023
你在“答案”中写了“帮助更新数组”。然后说你不知道“[我]在说什么数组更新”。真?
1赞 kaxi1993 #40

不应单独信任用户代理字符串。以下解决方案适用于所有情况。

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)

评论

0赞 oldboy 11/13/2020
有必要吗?它到底有什么作用?window.opera
0赞 Jake 2/6/2023
您已经承认了这个陷阱:“不应单独信任用户代理字符串。然而,你的答案完全依赖于 .否则,您认为和来自哪里?User-Agentnavigator.vendorwindow.opera
6赞 Sanjay Joshi #41

我建议使用以下字符串组合来检查是否正在使用设备类型。

根据Mozilla文档,建议使用字符串。但是,如果仅使用,一些旧平板电脑不会返回 true,因此我们也应该使用字符串。MobiMobiTablet

同样,为了安全起见,字符串也可用于检查设备类型。iPadiPhone

大多数新设备将仅返回字符串。trueMobi

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

评论

5赞 Andy 5/4/2017
我不得不在那里添加“android”才能在平板电脑上工作。我必须调整,但我喜欢这种方法。
6赞 3 revs, 2 users 97%Mohamad Hamouday #42

我知道这个老问题,有很多答案,但我认为这个功能很简单,将有助于检测所有手机、平板电脑和计算机浏览器,它就像一个魅力。

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;
}
-5赞 2 revs, 2 users 75%Ankit Kumar #43

使用这个

if( screen.width <= 480 ) { 
    // is mobile 
}

评论

2赞 Liam 8/2/2017
...如果我的桌面浏览器大小小于 480 会怎样?为什么是 480。我想当横向宽度超过 480 时会有手机。
1赞 Daniel Kucal #44

如果通过移动设备,您可以了解可触摸设备,那么您可以通过检查触摸处理程序的存在来确定它:

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

它不需要jQuery。

0赞 2 revs, 2 users 89%Gor Davtyan #45

这是使用纯 JavaScript (es6) 实现的另一个建议

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

detectDeviceType();

评论

0赞 mrReiha 7/23/2019
绝对不需要箭头语法函数。
0赞 Jake 2/6/2023
@mrReiha 完全不需要这个,箭头语法或其他。 嗅探是错误的方法。User-Agent
5赞 2 revs, 2 users 95%Vishnu Prasanth G #46
<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 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36

如果你在移动设备上做同样的事情,你会得到关注

Mozilla/5.0 (Linux;安卓 8.1.0;Pixel Build/OPP6.171019.012) AppleWebKit/537.36(KHTML,类似 Gecko) Chrome/61.0.3163.98 移动 Safari/537.36

每个移动浏览器都会有包含“Mobile”字符串的用户代理,所以我在我的代码中使用上面的代码片段来检查当前用户代理是否是 web/mobile。根据结果,我将进行必要的更改。

8赞 nescafe #47

您可以使用媒体查询来轻松处理它。

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

根据您想要检测移动设备的内容(这意味着此建议并不适合每个人的需求),您可以通过查看 onmouseenter-to-onclick 毫秒差异来实现区分,就像我在此答案中描述的那样。

评论

0赞 Jake 2/6/2023
在 CSS4 中,您可以使用 或 检测触摸设备。在 JS 中,您可以与上述任何一个参数一起使用。+1.这通常是正确的方法。@media (any-pointer: coarse)@media (pointer: coarse)matchMedia
-4赞 2 revsRonnie Royston #49

Window.matchMedia()

Window 接口的方法返回一个新对象,然后可以使用该对象来确定 document 匹配媒体查询字符串,以及监控 文档以检测它何时匹配(或停止匹配)该媒体 查询。matchMedia()MediaQueryList

使用说明 您可以使用返回的媒体查询来执行这两项操作 即时和事件驱动的检查,以查看文档是否匹配 媒体查询。

执行一次性即时检查以查看文档是否 匹配媒体查询,查看 matches 属性的值, 如果文档符合媒体查询的 要求。true

如果您需要随时了解文档是否匹配 媒体查询,您可以随时观察更改 要传递给对象的事件。有一个很好的例子 有关 Window.devicePixelRatio 的文章。

let mql = window.matchMedia('(max-width: 767px)');

评论

0赞 Jake 2/6/2023
+1 表示意识到,如果桌面用户调整窗口大小,它会变成梨形。否则,一个可怕的解决方案。
0赞 2 revsTwil #50

利用前面提到的sequielo解决方案,并增加了宽度/高度检查功能(以避免屏幕旋转错误)。为了选择移动视口的最小/最大边框,我使用此资源 https://www.mydevice.io/#compare-devices

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

function deviceType() {
    var width = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
    var height = Math.max(document.documentElement.clientHeight, window.innerHeight || 0),screenType;
    if (isMobile()){
        if ((width <= 650 && height <= 900) || (width <= 900 && height <= 650))
            screenType = "Mobile Phone";
        else
            screenType = "Tablet";
    }
    else
        screenType = "Desktop";
  return screenType;
}

评论

1赞 oldboy 11/13/2020
是否有任何理由尝试创建触摸事件而不是检查是否存在?touchstart
0赞 Jake 2/6/2023
许多台式机也有触摸屏。窗口可以调整大小。
9赞 3 revs, 2 users 79%nelek #51

我知道关于这种检测是一个非常古老的问题。

我的解决方案基于滚动条宽度(存在与否)。

// this function will check the width of scroller
// if scroller width is 0px it's mobile device

//function ismob() {
    var dv = document.getElementById('divscr');
    var sp=document.getElementById('res');
    if (dv.offsetWidth - dv.clientWidth == 10) {sp.innerHTML='Is mobile'; //return true; 
    } else {
    sp.innerHTML='It is not mobile'; //return false;
    }
//}
<!-- put hidden div on very begining of page -->
<div id="divscr" style="position:fixed;top:0;left:0;width:50px;height:50px;overflow:hidden;overflow-y:scroll;z-index:-1;visibility:hidden;"></div>
<span id="res"></span>

评论

0赞 James 1/27/2020
我喜欢这个解决方案,我们有什么理由不应该使用它吗?
3赞 Ivan 5/3/2020
绝对太棒了!而且它完全是跨浏览器的。谢谢!编辑:最好检查一下,因为如果窗口放大,滚动条会小于 10px,这在大多数高分辨率但屏幕较小的现代笔记本电脑中都是这种情况(即 4 英寸屏幕上的 15.6k 分辨率)(dv.offsetWidth - dv.clientWidth) == 0
0赞 oldboy 11/13/2020
多么独特的解决方案。我还没有在其他任何地方看到过这个。我可以看到这遇到了滚动条被隐藏的问题(例如)有没有人测试过?::-webkit-scrollbar { display: none }
0赞 nelek 1/5/2021
@oldboy尝试将 visible 设置为 (.我不使用 chrome,也不想仅出于测试目的安装它。任何人?scrollbardivid="divscr")
0赞 Spider IT 9/10/2022
很棒的解决方案!我刚刚删除了对现有 div 的需求:function is_mobile() { var div = document.createElement('div'); div.style.position = 'fixed'; div.style.left = 0; div.style.top = 0; div.style.width = '50px'; div.style.height = '50px'; div.style.overflowY = 'scroll'; document.body.append(div); if (div.offsetWidth - div.clientWidth == 0) { var ret = true; } else { var ret = false; } div.remove(); return ret; }
1赞 Pinonirvana #52

我使用此解决方案,它在所有设备上都能正常工作:

if (typeof window.orientation !== "undefined" || navigator.userAgent.indexOf('IEMobile') !== -1) {
   //is_mobile
}

评论

1赞 Gaby_64 5/16/2020
我正在考虑这一点,但后来我想到当用户从 chrome 菜单请求桌面站点时,这是通过 User-Agent 字符串完成的,将不再起作用。
0赞 AnorZaken 10/19/2021
不幸的是,window.orientation 现在已被弃用,它的替代品也适用于桌面 - 所以恐怕不再有用。:(
4赞 Lauro Moraes #53

在一个模块中使用多种检测技术的 ES6 解决方案try/catch

该函数包括创建“TouchEvent”、寻求对“ontouchstart”事件的支持,甚至对对象进行查询。mediaQueryList

故意,一些失败的查询会引发新的错误,因为当我们处于一个块中时,我们可以将其用作回退来咨询用户代理。try/catch

我没有使用测试,在许多情况下,它可能会失败并指出误报。

它不应该用于任何形式的实际验证,但是,在分析和统计的一般范围内,数据量可以“原谅”缺乏精确度,它可能仍然有用。

const isMobile = ((dc, wd) => {
    // get browser "User-Agent" or vendor ... see "opera" property in `window`
    let ua = wd.userAgent || wd.navigator.vendor || wd.opera;
    try {
        /**
         * Creating a touch event ... in modern browsers with touch screens or emulators (but not mobile) does not cause errors.
         * Otherwise, it will create a `DOMException` instance
         */
        dc.createEvent("TouchEvent");

        // check touchStart event
        (('ontouchstart' in wd) || ('ontouchstart' in dc.documentElement) || wd.DocumentTouch && wd.document instanceof DocumentTouch || wd.navigator.maxTouchPoints || wd.navigator.msMaxTouchPoints) ? void(0) : new Error('failed check "ontouchstart" event');

        // check `mediaQueryList` ... pass as modern browsers
        let mQ = wd.matchMedia && matchMedia("(pointer: coarse)");
        // if no have, throw error to use "User-Agent" sniffing test
        if ( !mQ || mQ.media !== "(pointer: coarse)" || !mQ.matches ) {
            throw new Error('failed test `mediaQueryList`');
        }

        // if there are no failures the possibility of the device being mobile is great (but not guaranteed)
        return true;
    } catch(ex) {
        // fall back to User-Agent sniffing
        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(ua) || /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(ua.substr(0,4));
    }
})(document, window);


// to show result
let container = document.getElementById('result');

container.textContent = isMobile ? 'Yes, your device appears to be mobile' : 'No, your device does not appear to be mobile';
<p id="result"></p>


用于测试用户代理的正则表达式有点旧,可以在网站 http://mobiledetect.com 上找到,该网站已不再运行。

也许有更好的模式,但是,我不知道。


字体


PS的:

因为无论是通过检查特征,还是通过使用正则表达式检查用户代理字符串,都无法 100% 准确地识别。上面的代码片段应仅显示为:“此问题的另一个示例”,以及:“不建议在生产中使用”。

评论

0赞 oldboy 11/13/2020
那么,您建议使用什么进行“真实”验证呢?
0赞 Jake 2/6/2023
在 CSS4 中,您可以使用 @media(任意指针:粗略)@media(指针:粗略)来检测触摸设备。在 JS 中,您可以与前面的参数一起使用。+1.这通常是正确的方法。matchMedia
-2赞 AmerllicA #54

只需复制以下函数,它就会返回一个布尔值。它的正则表达式看起来像标记的答案,但它有一些区别:

const isMobile = () =>
  /(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([46])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([ev])w|bumb|bw-([nu])|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do([cp])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-([mpt])|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c([- _agpst])|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac([ \-/])|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja([tv])a|jbro|jemu|jigs|kddi|keji|kgt([ /])|klon|kpt |kwc-|kyo([ck])|le(no|xi)|lg( g|\/([klu])|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([- ov])|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30([02])|n50([025])|n7(0([01])|10)|ne(([cm])-|on|tf|wf|wg|wt)|nok([6i])|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan([adt])|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([-01])|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([im])|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)
  );

评论

0赞 Jake 2/6/2023
请使用功能检测,而不是嗅探。User-Agent
3赞 2 revs, 2 users 80%Bienfait Rukundo #55

你可以像这样做简单的事情

(window.screen.width < 700) {
    //The device is a Mobile
} else {
    //The device is a Desktop
}

评论

7赞 sea26.2 9/11/2020
仅仅因为视口< 700 并不能使设备移动
0赞 Eliezer Berlin 6/3/2021
@sea26.2 这是真的。然而,就我们的目的而言,它实际上效果更好,因为我们希望我们的 javascript 能够与我们的 CSS 媒体查询正确交互。
0赞 Typewar 7/2/2021
这段代码不是应该检查它是纵向还是横向吗?或者一般像素是多少?为什么不呢?if (window.screen.width < window.screen.height)
-1赞 Sir Papilonius #56

你们会做太多的工作。

if (window.screen.availWidth <= 425) {
   // do something
}

您可以通过 JS 在页面加载时执行此操作。无需编写长字符串列表来尝试捕获所有内容。哎呀,你错过了一个!然后你必须回去改变它/添加它。更流行的手机尺寸约为 425 或更小(纵向模式),平板电脑约为 700 左右,任何更大的尺寸都可能是笔记本电脑、台式机或其他更大的设备。如果你需要移动横向模式,也许你应该在 Swift 或 Android Studio 中工作,而不是传统的 Web 编码。

旁注:这在发布时可能不是可用的解决方案,但现在有效。

-2赞 Omer Hijazi #57

这是我所做的:

function checkMobile() {
  var os = GetOS();
  if (os == "Android OS" || os == "iOS") {
     // do what you wanna do
     return true
  }
}

为了重定向,我添加了location.href=“mobile.website.com” 然后添加此正文标签

<body onload="checkMobile()"></body>

评论

1赞 oligofren 12/16/2022
这是不完整的。您依赖于答案中未包含的函数来完成所有工作。
2赞 Diego Favero #58

屏幕可能是在分辨率较小的桌面上,也可能是在分辨率较宽的移动设备上,因此,结合了这个问题中的两个答案

const isMobile = window.matchMedia("only screen and (max-width: 760px)");
if (/Mobi|Tablet|iPad|iPhone/i.test(navigator.userAgent) || isMobile.matches) {
    console.log('is_mobile')
}

评论

0赞 Jake 2/6/2023
如果我将桌面窗口的大小调整到小于 760px 宽,这将失败。
2赞 topsoftwarepro #59

以下答案改编自 https://attacomsian.com/blog/javascript-detect-mobile-device 的答案。

要检测用户是否在 JavaScript 中使用移动设备,我们可以使用该属性。userAgent

此属性是对象的一部分,由浏览器在 HTTP 标头中发送。它包含有关浏览器的名称、版本和平台的信息。navigator

有了值 ,我们可以使用正则表达式来测试它是否包含一些关键字,然后确定设备的类型(手机、平板电脑或台式机)。或者,还可以将此测试与当前窗口的宽度相结合。userAgent

下面是一个函数,它返回用户当前所在的设备类型:

function deviceType() {
    const ua = navigator.userAgent;
    if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(ua)) {
        return "tablet";
    }
    else if (/Mobile|Android|iP(hone|od)|IEMobile|BlackBerry|Kindle|Silk-Accelerated|(hpw|web)OS|Opera M(obi|ini)/.test(ua)) {
        return "mobile";
    }
    return "desktop";
};
console.log(deviceType());

🔑 注意:上述解决方案并不总是可靠的。的值可以很容易地改变。例如,当我们使用机器人抓取网站时,我们可以传递一个完全不同的用户代理值来隐藏我们的身份。这将使检测实际设备类型变得困难。userAgent

-1赞 Vahid Alvandi #60

你需要控制调整大小

var  is_mobile = false;
        $(window).resize(function() {

            if ($('#mobileNav').css('display') == 'block') {
                is_mobile = true;
            }

            if (is_mobile == true) {

                console.log('is_mobile')
                document.addEventListener(
                    "DOMContentLoaded", () => {
                        new Mmenu("#mainMenu", {
                            "offCanvas": {
                                "position": "right-front"
                            }
                        });
                    }
                );

            }

        }).resize();

评论

0赞 Jake 2/6/2023
这个答案是断章取义的。OP 没有 ID 为 的元素。mobileNav
2赞 Tantrik #61

MDN 建议使用 Navigator.maxTouchPoints 检查可用的可触摸点。如果> 0 ,则设备是可点击的,很可能是手机或平板电脑。https://developer.mozilla.org/en-US/docs/Web/API/Navigator/maxTouchPoints

评论

0赞 Jake 2/6/2023
在 CSS4 中,您可以使用 @media(任意指针:粗略)@media(指针:粗略)来检测触摸设备。在 JS 中,您可以与前面的参数一起使用。+1.这通常是正确的方法。matchMedia
-2赞 Ahmad #62

如果使用 Bootstrap,则可以将此元素添加到页面并检查其可见性:

      <div id="mobile-detect" class="d-sm-none d-md-block" > </div>


function is_mobile() {
   if( $('#mobile-detect').css('display')=='none') {
       return true;
   }
   return false
}

评论

0赞 Jake 2/6/2023
请不要使用 CSS 重置样式表。这在 2023 年是完全没有必要的,并且使你的继任者的工作变得更加困难,因为他们花了很长时间试图弄清楚一些流氓 CSS 设置的来源。
-3赞 user1212212 #63

navigator.userAgentData.mobile 返回 [true|false]

评论

0赞 James 8/17/2022
将来可能会很好,但目前 iOS Safari 不支持它,其中包括:developer.mozilla.org/en-US/docs/Web/API/......
0赞 Jake 2/6/2023
@James 它在未来可能不会有任何好处,因为它可能会被懒惰的“开发人员”滥用(基于这里“答案”的证据)。它可能用于检测能够拨打电话的设备(例如,用于链接)。特征检测是必经之路。tel:
-1赞 Jake #64

移动设备的具体功能是什么,这意味着您想要不同的行为?

是输入机制(触摸和虚拟键盘与鼠标和物理键盘)、较小的屏幕尺寸还是其他原因?

例如,在 CSS4 中,您可以将 @media (any-pointer: coarse) 用于支持触摸的设备,将 @media (pointer: coarse) 用于主要输入为触摸的设备(即手机和平板电脑,无论是否插入外部键盘)。CSS4 大多完全受现代浏览器支持。

在 JavaScript 中,您可以使用 Window.matchMedia() 来测试任何 CSS 媒体查询(包括上面的查询),如此 SO 答案中所建议的那样。(我现在本来希望有更本土的东西,但什么也找不到。

0赞 Afzal K. #65

将所有方法和检查组合在一起,以确定设备是否为支持内部陀螺仪和传感器的移动设备:

function isMobileDevice() {
  // touch support
  if ($.support.touch) {
    // check screen width
    if (window.innerWidth < 768) {
      // check for jQuery Mobile
      if ($.mobile) {
        // check user agent
        if (navigator.userAgent.match(/Mobile/i)) {
          // check for camera and microphone support
          if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
            // check for support for internal sensors and gyro
            if (window.DeviceOrientationEvent && window.DeviceMotionEvent) {
              // if all conditions are met, return true
              return true;
            }
          }
        }
      }
    }
  }
  
  // if any of the conditions are not met, return false
  return false;
}

if (isMobileDevice()) {
  // mobile
} else {
  // desktop
}

这可能不适用于所有移动设备,可以根据需要进行修改