如何使用jQuery检测移动设备

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

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

1895613 次浏览

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

它提供脚本来检测多种语言的移动浏览器,其中之一是JavaScript。这可能会帮助您找到您要找的东西。

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

因为我不知道你到底想完成什么,我不知道哪一个最有用。

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

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

编者注:用户代理检测不是现代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"

注意:$.browserjQuery v1.9.1上删除。但是您可以使用jQuery迁移插件代码使用它


更全面的版本:

var isMobile = false; //initiate as false// device detectionif(/(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;}

有时需要知道客户端使用的是哪个品牌的设备,以便显示特定于该设备的内容,例如指向iPhone商店或Android市场的链接。现代器很棒,但只显示浏览器功能,如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();}}

此解决方案来自图形狂人http://graphicmaniacs.com/note/detecting-iphone-ipod-ipad-android-and-blackberry-browser-with-javascript-and-php/

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

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

这里有一个函数,你可以用它来得到一个关于你是否在移动浏览器上运行的真/假答案。是的,它是浏览器嗅探,但有时这正是你需要的。

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

我以前用过类似的东西。这类似于之前的响应,但它在技术上更具性能,因为它缓存了匹配的结果,特别是当检测被用于动画、滚动事件等时。

看看这个帖子,它提供了一个非常好的代码片段,说明当检测到触摸设备时该怎么办,或者如果调用了触摸启动事件该怎么办:

$(function(){if(window.Touch) {touch_detect.auto_detected();} else {document.ontouchstart = touch_detect.surface;}}); // End loaded jQueryvar 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_detectfunction 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();}

很好的回答,谢谢。支持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 codeself.location = "top.htm";}

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

在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喜欢框,因为它加载了所有这些个人资料图像和东西。这对移动访问者不利。所以,除了隐藏容器元素之外,我还在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中添加任何虚拟元素。

我用这个

if(navigator.userAgent.search("mobile")>0 ){do something here}

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

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

iPhone你会得到320的window.screen.width。在Android上,你会得到480的window.outer宽度(尽管这取决于Android)。iPad和Android平板电脑会返回768这样的数字,这样它们就可以得到你想要的完整视图。

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

如果user伪造了这一点,他们就不必担心了。如果你是test.isUnix(),你就不必担心系统是否是Unix。

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

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

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

您还可以使用服务器端脚本并从中设置javascript变量。

php中的示例

下载http://code.google.com/p/php-mobile-detect/,然后设置javascript变量。

<script>//set defaultsvar device_type = 'desktop';</script>
<?phprequire_once( 'Mobile_Detect.php');$detect = new Mobile_Detect();?>
<script>device_type="<?php echo ($detect->isMobile() ? ($detect->isTablet() ? 'tablet' : 'mobile') : 'desktop'); ?>";alert( device_type);</script>

找到了一个解决方案: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...}

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

if (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ||(/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.platform))) {// some code...}

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

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

你也可以像下面这样检测

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

为了添加额外的控制层,我使用HTML5存储来检测它是使用移动存储还是桌面存储。如果浏览器不支持存储,我有一个移动浏览器名称数组,并将用户代理与数组中的浏览器进行比较。

这很简单。这是函数:

// Used to detect whether the users browser is an mobile browserfunction 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 storagereturn false;else if (localStorage.mobile) // mobile storagereturn true;
// alternativemobile = ['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 desktopreturn false;}

使用这个:

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

如果您使用modnizr,则很容易使用前面提到的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)

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

请参阅SO问题

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

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

我尝试了一些方法,然后我决定手动填写一个列表并做一个简单的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'){...}

我很惊讶没有人指出一个不错的网站:http://detectmobilebrowsers.com/它已经准备好了不同语言的代码用于移动检测(包括但不限于):

  • apache
  • asp
  • c#
  • IIS
  • javascript
  • Nginx
  • php
  • perl
  • python
  • Rails

如果您还需要检测平板电脑,只需检查关于部分以获取其他RegEx参数。

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

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()}

一个简单而有效的单行:

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

但是,上面的代码没有考虑带触摸屏的笔记本电脑的情况。因此,我提供了第二个版本,基于@朱利安解决方案

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

基于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));}

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

这就是你正在寻找的。

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

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

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

看看这个…

[免责声明:我与写它的人无关。

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

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

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

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

根据Mozilla-使用用户代理进行浏览器检测

总之,我们建议在用户代理中的任何位置查找字符串“Mobi”以检测移动设备。

像这样:

if (/Mobi/.test(navigator.userAgent)) {// mobile!}

这将匹配所有常见的移动浏览器用户代理,包括移动Mozilla,Safari,IE,Opera,Chrome等。

Android更新

EricL建议将Android作为用户代理进行测试,因为平板电脑的Chrome用户代理字符串不包括“Mobi”(但手机版本包含):

if (/Mobi|Android/i.test(navigator.userAgent)) {// mobile!}

按平台名称过滤。

例如:

x = $( window ).width();
platform = navigator.platform;
alert(platform);
if ( (platform != Ipad) || (x < 768) )  {

}

^^

mobiledetect.net怎么样?

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

在javascript的一行中:

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

如果用户代理包含'Mobi'(根据MDN)并且onTouchStart可用,则它很可能是移动设备。

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

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

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

我知道这个问题有很多答案,但从我看到的情况来看,没有人像我解决这个问题那样接近答案。

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

例如,在Bootstrap的(移动优先)媒体查询中,存在4个捕捉/断点:

  • 超小型设备为768像素及以下。
  • 小型设备的范围从768到991像素。
  • 中型设备的范围从992到1199像素。
  • 大型设备为1200像素及以上。

我们也可以用它来解决我们的JavaScript问题。

首先,我们将创建一个获取窗口大小并返回一个值的函数,该值允许我们查看设备正在查看我们的应用程序的大小:

var getBrowserWidth = function(){if(window.innerWidth < 768){// Extra Small Devicereturn "xs";} else if(window.innerWidth < 991){// Small Devicereturn "sm"} else if(window.innerWidth < 1199){// Medium Devicereturn "md"} else {// Large Devicereturn "lg"}};

现在我们已经设置了函数,我们可以调用它并存储值:

var device = getBrowserWidth();

你的问题是

如果浏览器在手持设备上,我想运行不同的脚本。

现在我们有了设备信息,剩下的就是一个if语句:

if(device === "xs"){// Enter your script for handheld devices here}

下面是CodePen的一个例子:http://codepen.io/jacob-king/pen/jWEeWG

我这样做是为了我的. NET应用程序。

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

@{var isMobileDevice = HttpContext.Current.Request.Browser.IsMobileDevice;}
<html lang="en" class="@((isMobileDevice)?"ismobiledevice":"")">

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

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

添加:

在某些版本的iOS9. x中,Safari没有在navigator.userAgent中显示“iPhone”,而是在navigator.platform中显示。

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

这些是我所知道的所有变量。如果您知道任何其他值,请帮助修改数组。

function ismobile(){if(/android|webos|iphone|ipad|ipod|blackberry|opera mini|Windows Phone|iemobile|WPDesktop|XBLWP7/i.test(navigator.userAgent.toLowerCase())) {return true;}elsereturn false;}

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

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)

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

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

类似地,对于处于安全侧的iPadiPhone字符串也可以用于检查设备类型。

大多数新设备将仅为Mobi字符串返回true

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

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

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

用这个

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

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

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

它不需要jQuery。

这里还有一个用纯JavaScript(es6)实现的建议

const detectDeviceType = () =>/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)? 'Mobile': 'Desktop';
detectDeviceType();
<script>function checkIsMobile(){if(navigator.userAgent.indexOf("Mobile") > 0){return true;}else{return false;}}</script>

如果您转到任何浏览器,如果您尝试获取navigator.user代理,那么我们将获得如下浏览器信息

Mozilla/5.0(Macintosh; Intel Mac OS X10_13_1)AppleWebKit/537.36(KHTML,如Gecko)Chrome /64.0.3282.186Safari /537.36

同样的事情,如果你做的移动你会得到以下

Mozilla/5.0(Linux;Android 8.1.0;Pixel Build/OPP6.171019.012)AppleWebKit/537.36(KHTML,如Gecko)Chrome /61.0.3163.98手机Safari /537.36

每个移动浏览器都将具有包含“移动”的字符串的用户代理,因此我在代码中使用上述片段来检查当前用户代理是否为Web/移动。根据结果,我将进行必要的更改。

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

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

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

粗糙,但足以限制加载更大的资源,例如手机与平板电脑/桌面上的视频文件-只需寻找小宽度或高来覆盖两个方向。显然,如果桌面浏览器已调整大小,下面的可能会错误地检测到手机,但这对我的用例来说已经足够好了。

为什么是480,bcs,这就是我在手机设备尺寸上找到的信息。

if(document.body.clientWidth < 480 || document.body.clientHeight < 480) {//this is a mobile device}

利用前面提到的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";elsescreenType = "Tablet";}elsescreenType = "Desktop";return screenType;}

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

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

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

我使用这个解决方案,它适用于所有设备:

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

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

该函数包括创建事件列表"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 browserslet mQ = wd.matchMedia && matchMedia("(pointer: coarse)");// if no have, throw error to use "User-Agent" sniffing testif ( !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 sniffingreturn /(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 resultlet 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>


The regex used to test the user agent is a little old and was available on the website http://mobiledetect.com which is no longer in operation.

Maybe there is a better pattern but, I don't know.


Fonts:


PS:

As there is no way to identify with 100% accuracy neither by checking features, nor by examining the user agent string with regular expressions. The code snippet above should be seen only as: "one more example for this issue", as well as: "not recommended for use in production".

只需复制以下函数并返回一个布尔值。它的regex看起来像标记的答案,但它有一些区别:

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

你可以做很简单的事就像这样

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

你会做太多的工作。

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

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

附注:这可能不是一个可用的解决方案,当它被发布,但它现在工作。

我是这样做的:

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

重定向我添加location.href="mobile.website.com"然后添加这个body标签

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

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

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

IE10+解决方案仅使用MatchMedia

const isMobile = () => window.matchMedia('(max-width: 700px)').matches

isMobile()返回一个布尔值

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

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

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

如果值为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的值可以很容易地更改。例如,当我们使用机器人抓取网站时,我们可以传递一个完全不同的用户代理值来隐藏我们的身份。这将使实际设备类型难以检测。

在新版本的chrome(101)解决方案中,使用navigator.platform可能无法工作google支持网站,但有一种更简单的方法来检查设备是否移动。

if (navigator.userAgentData.mobile === 'true') {//code for mobileconsole.log('mobile');}else {//code for PCs & laptopsconsole.log('PC');}

你需要控制大小

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();

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

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

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

检测窗口/移动浏览器是否为手机屏幕的典型格式的可能性,我建议使用窗口高度和宽度(javascript/jQuery):

isMobileFormat = ($(window).innerHeight() / $(window).innerWidth()) >= 1.5