检测移动浏览器

ave*_*ave 808 javascript browser-detection mobile-browser platform-detection

我正在寻找一个函数,如果用户有移动浏览器,则返回布尔值.

我知道我可以使用navigator.userAgent正则表达式来使用和编写该函数,但是用户代理对于不同的平台来说太多了.我怀疑匹配所有可能的设备会很容易,我认为这个问题已经解决了很多次,所以应该有一些完整的解决方案来完成这样的任务.

我正在看这个网站,但遗憾的是脚本是如此神秘,以至于我不知道如何将它用于我的目的,即创建一个返回true/false的函数.

Mic*_*ets 1211

使用Regex(来自detectmobilebrowsers.com):

这是一个使用疯狂长而全面的正则表达式的函数,它根据用户是否正在使用移动设备进行浏览来返回真值或假值.

window.mobilecheck = function() {
  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;
};
Run Code Online (Sandbox Code Playgroud)

对于那些希望在此测试中包含平板电脑的人(尽管可以说,您不应该),您可以使用以下功能:

window.mobileAndTabletcheck = function() {
  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|android|ipad|playbook|silk/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;
};
Run Code Online (Sandbox Code Playgroud)

原始答案

您可以通过简单地运行设备列表并检查useragent是否与以下内容匹配来执行此操作:

function detectmob() { 
 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/i)
 || navigator.userAgent.match(/Windows Phone/i)
 ){
    return true;
  }
 else {
    return false;
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,由于您认为此方法不可靠,您可以假设分辨率为800x600或更低的任何设备也是移动设备,甚至更多地缩小您的目标(尽管现在许多移动设备的分辨率远高于此)

function detectmob() {
   if(window.innerWidth <= 800 && window.innerHeight <= 600) {
     return true;
   } else {
     return false;
   }
}
Run Code Online (Sandbox Code Playgroud)

参考:

  • @RichardLovejoy在建站点时,ipad一般不算移动. (47认同)
  • 来自[about](http://detectmobilebrowsers.com/about)页面:Android平板电脑,iPad,Kindle Fire和PlayBooks未被设计检测到.要添加对平板电脑的支持,请将`| android | ipad | playbook | silk`添加到第一个正则表达式. (41认同)
  • Gawd,用户代理的整个想法很糟糕,真的,真的需要停下来.我们真的需要停止让客户与潮流作斗争,并坚持使用媒体查询.如果他们想根据特定页面的比例进行重定向,那么只需通过JS检查特定媒体查询的范围即http://tylergaw.com/articles/reacting-to-media-queries-in-javascript (28认同)
  • 嗨,我刚刚访问了iPad 3,iOS 6.1.2上的http://detectmobilebrowsers.com链接,并说"没有检测到移动浏览器". (24认同)
  • 谷歌电视也是Android.什么定义了手机?屏幕尺寸 ?触摸?deviceOrientation?当我设计它更多的是鼠标悬停的问题,大bouton或小链接.所以,现在,我运行"if(Modernizr.touch)":) (11认同)
  • 对于那些说我们应该依赖媒体查询的人来说,这往往不会削减它.例如,我有一个播放HTM5音频的网站,移动浏览器的行为与在桌面浏览器上的行为不同; 例如iOS在播放音频之前需要用户交互.媒体查询和Modernizr都无法检测到这些类型的东西. (8认同)
  • @marksyzm您似乎从网页设计的角度来看待这一点,但在Web应用程序领域,根据任意业务规则将自己局限于移动浏览器上的显示方式(无论屏幕大小如何),这种情况并不少见. (6认同)

yoa*_*nea 312

怎么样:

if (typeof window.orientation !== 'undefined') { ... }
Run Code Online (Sandbox Code Playgroud)

...因为智能手机通常支持此属性,而桌面浏览器则不支持.

编辑:正如@Gajus所指出的,此解决方案现已弃用,不应使用(https://developer.mozilla.org/en-US/docs/Web/API/Window/orientation)

  • 这可能不会长期有效.1)平板电脑可以有不错的屏幕尺寸,你希望它们显示完整的桌面网站,但他们将拥有这个属性2)Windows 8在这里,并带有一堆笔记本电脑,触摸屏和旋转的屏幕. (77认同)
  • `window.orientation`是一个弃用的属性(https://developer.mozilla.org/en-US/docs/Web/API/Window/orientation,https://compat.spec.whatwg.org/#dom-window -orientation)一些移动浏览器因未知原因选择支持.相同的浏览器实现了`window.screen.orientation`(也在桌面浏览器中定义).我只能假设`window.orientation`由于遗留原因留在那里,因此不应该在新的应用程序中使用. (38认同)
  • screen.orientation 在桌面上也受支持 https://developer.mozilla.org/en-US/docs/Web/API/Screen/orientation#browser_compatibility (26认同)
  • 这实际上是超级独特和令人敬畏的,你介意我把它添加到我的答案吗? (14认同)
  • 关于平板电脑尺寸不错的平板电脑的第一点 - 我认为你可以为所有其他解决方案做出相同的论点(一个大屏幕的平板电脑被跟踪为小屏幕).无论如何,这里的想法是搜索由小型设备共享的属性,而不是保留维护长代码,并在每个新的设备/版本/模型中添加正则表达式.我认为设备检测属于过去,今天我们需要关注特征检测.我会很高兴在这里找到更合适的财产...... (10认同)
  • 为了更深入地了解 @lctus 的评论,截至撰写本文时,我认为答案不再可用,应该对此进行更新。在 Chrome 和 Firefox 的桌面版本上,定义了“screen.orientation”,因此该解决方案至少会为这些桌面浏览器提供误报。 (3认同)
  • 不再起作用了 (3认同)
  • 喜欢它并且完美地工作,谢谢你.对于我的解决方案,我只是在简单. (2认同)
  • 然后只需使用 if(window.orientation || window.screen.orientation) {}。问题解决了 (2认同)
  • @AliMertCakar我同意,但是chrome(也可能是其他)在桌面中定义了window.screen.orientation。干杯。 (2认同)

Mud*_*Ali 108

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) || navigator.userAgent.match(/WPDesktop/i);
    },
    any: function() {
        return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
    }
};
Run Code Online (Sandbox Code Playgroud)

如何使用

if( isMobile.any() ) alert('Mobile');
Run Code Online (Sandbox Code Playgroud)

要检查用户是否在特定移动设备上:

if( isMobile.iOS() ) alert('iOS');
Run Code Online (Sandbox Code Playgroud)

参考:http://www.abeautifulsite.net/blog/2011/11/detecting-mobile-devices-with-javascript

github上的增强版:https://github.com/smali-kazmi/detect-mobile-browser

  • @AkarshSatija 这 5 次正则表达式检查导致的性能下降实际上会影响您的任何应用程序吗?如果确实如此,我会感到非常惊讶。过早的优化可能会浪费时间...... (3认同)
  • 我可以建议 `any: () =&gt; /Mobile/.test(navigator.userAgent)` (3认同)
  • 也许将iOS移至BlackBerry()之前只是为了将更常见的情况放在首位,并让早期救助节省一些额外的处理时间? (2认同)
  • @Rob_vH我已将此代码放入github(https://github.com/smali-kazmi/detect-mobile-browser)并具有一些先进的功能; 你也可以在那里发送建议 (2认同)

San*_*osh 56

这是facebook的弹弓来源的简单解决方案

var isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
if (isMobile) {
  /* your code here */
}
Run Code Online (Sandbox Code Playgroud)

  • 安卓电视呢? (2认同)

Tig*_*ger 25

来到这里寻找一种简单,干净的方式来检测"触摸屏设备",我将其归类为手机和平板电脑.在当前的答案中没有找到一个干净的选择,但确实解决了以下可能也有帮助的人.

var touchDevice = ('ontouchstart' in document.documentElement);
Run Code Online (Sandbox Code Playgroud)

编辑:要同时支持带触摸屏和手机的桌面,您可以使用以下内容:

var touchDevice = (navigator.maxTouchPoints || 'ontouchstart' in document.documentElement);
Run Code Online (Sandbox Code Playgroud)

  • 如果桌面显示器支持触摸怎么办? (8认同)
  • Bootstrap datepicker 使用以下内容: if ( window.navigator.msMaxTouchPoints || 'ontouchstart' in document) { this.input.blur(); } (2认同)
  • @JTTaylor看起来微软是[推荐](https://msdn.microsoft.com/en-us/library/hh772144.aspx)“navigator.maxTouchPoints”(没有“ms”前缀)。还有一篇[MDN文章](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/maxTouchPoints)可供检查。 (2认同)

Joh*_*ers 14

没有完美的解决方案来检测JS代码是否在移动浏览器上执行,但在大多数情况下,以下两个选项都可以使用.

选项1:浏览器嗅探

!function(a){var b=/iPhone/i,c=/iPod/i,d=/iPad/i,e=/(?=.*\bAndroid\b)(?=.*\bMobile\b)/i,f=/Android/i,g=/(?=.*\bAndroid\b)(?=.*\bSD4930UR\b)/i,h=/(?=.*\bAndroid\b)(?=.*\b(?:KFOT|KFTT|KFJWI|KFJWA|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|KFARWI|KFASWI|KFSAWI|KFSAWA)\b)/i,i=/IEMobile/i,j=/(?=.*\bWindows\b)(?=.*\bARM\b)/i,k=/BlackBerry/i,l=/BB10/i,m=/Opera Mini/i,n=/(CriOS|Chrome)(?=.*\bMobile\b)/i,o=/(?=.*\bFirefox\b)(?=.*\bMobile\b)/i,p=new RegExp("(?:Nexus 7|BNTV250|Kindle Fire|Silk|GT-P1000)","i"),q=function(a,b){return a.test(b)},r=function(a){var r=a||navigator.userAgent,s=r.split("[FBAN");return"undefined"!=typeof s[1]&&(r=s[0]),s=r.split("Twitter"),"undefined"!=typeof s[1]&&(r=s[0]),this.apple={phone:q(b,r),ipod:q(c,r),tablet:!q(b,r)&&q(d,r),device:q(b,r)||q(c,r)||q(d,r)},this.amazon={phone:q(g,r),tablet:!q(g,r)&&q(h,r),device:q(g,r)||q(h,r)},this.android={phone:q(g,r)||q(e,r),tablet:!q(g,r)&&!q(e,r)&&(q(h,r)||q(f,r)),device:q(g,r)||q(h,r)||q(e,r)||q(f,r)},this.windows={phone:q(i,r),tablet:q(j,r),device:q(i,r)||q(j,r)},this.other={blackberry:q(k,r),blackberry10:q(l,r),opera:q(m,r),firefox:q(o,r),chrome:q(n,r),device:q(k,r)||q(l,r)||q(m,r)||q(o,r)||q(n,r)},this.seven_inch=q(p,r),this.any=this.apple.device||this.android.device||this.windows.device||this.other.device||this.seven_inch,this.phone=this.apple.phone||this.android.phone||this.windows.phone,this.tablet=this.apple.tablet||this.android.tablet||this.windows.tablet,"undefined"==typeof window?this:void 0},s=function(){var a=new r;return a.Class=r,a};"undefined"!=typeof module&&module.exports&&"undefined"==typeof window?module.exports=r:"undefined"!=typeof module&&module.exports&&"undefined"!=typeof window?module.exports=s():"function"==typeof define&&define.amd?define("isMobile",[],a.isMobile=s()):a.isMobile=s()}(this);

alert(isMobile.any ? 'Mobile' : 'Not mobile');
Run Code Online (Sandbox Code Playgroud)

这个特定的浏览器嗅探代码是名为isMobile的库.


选项2:window.orientation

测试是否window.orientation定义:

var isMobile = window.orientation > -1;
alert(isMobile ? 'Mobile' : 'Not mobile');
Run Code Online (Sandbox Code Playgroud)


注意

并非所有触摸屏设备都是移动设备,反之亦然.因此,如果您想要专门为触摸屏实现某些功能,则不应测试您的浏览器是否在移动设备上运行,而是测试设备是否具有触摸屏支持:

var hasTouchscreen = 'ontouchstart' in window;
alert(hasTouchscreen ? 'has touchscreen' : 'doesn\'t have touchscreen');
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢你的“window.orientation”解决方案,但文档说它已被弃用!https://developer.mozilla.org/en-US/docs/Web/API/Window/orientation (2认同)
  • 定向方法并不好,因为Windows 8及更高版本可以改变方向. (2认同)

Ras*_*org 12

要添加额外的控制层,我使用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
    var mobile = ['iphone','ipad','android','blackberry','nokia','opera mini','windows mobile','windows phone','iemobile']; 
    for (var i in mobile) if (navigator.userAgent.toLowerCase().indexOf(mobile[i].toLowerCase()) > 0) return true;

    // nothing found.. assume desktop
    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 我还没有在手机上测试过,但是在Safari,Chrome或Firefox中都没有`sessionStorage.desktop`(发布时的所有最新版本).然而,你得到了一个投票,因为你的解决方案比其他解决方案更好.但是别忘了使用`var mobile =`而不是`mobile =`. (3认同)
  • 另外一个好主意是不要将indexOf用于旧浏览器,但仍然不支持该方法,或者使用polyfill.没有必要在小写值列表中使用toLowerCase,如果你正在运行/ipad|iphone|etc/i.test(navigator.userAgent)而不是你在那里的慢循环,也没有必要这样做. (3认同)

Abu*_*zzy 10

功能检测比试图找出您所使用的设备要好得多,并且很难跟上新设备的出现,像Modernizr这样的库可以让您知道某个特定功能是否可用.

  • 你已经回答了另一个问题,而不是问的问题.而不是"我如何检测移动设备?",您已回答"我如何检测某些功能?".并非所有设备检测都用于特征检测.如果我们想获得有关设备的统计信息怎么办?然后不,"特征检测"并不"比[计算设备]"好得多. (16认同)
  • 这不是答案,但它值得的不仅仅是评论。问题是:你为什么要检测浏览器,然后你可能会因为(缺乏)触摸而想知道它。响应式网页设计在大多数情况下就足够了。 (2认同)

gsx*_*y73 10

如许多人所述,依靠用户代理数据的移动目标是有问题的。指望屏幕大小也可以这样说。我的方法是借鉴CSS技术来确定界面是否触摸的方法。使用纯JavaScript(所有现代浏览器均支持),媒体查询,您可以轻松确定设备何时可移动。

function isMobile() {
    var match = window.matchMedia || window.msMatchMedia;
    if(match) {
        var mq = match("(pointer:coarse)");
        return mq.matches;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 我会检查!matchMedia(“(any-pointer:fine)”)。match我自己。(“没有插入鼠标”,而不是“有触摸屏”。 (4认同)
  • 此外,您可以测试悬停属性:对于智能手机和触摸屏@media(悬停:无)和(指针:粗糙) (4认同)
  • 带有触摸屏的笔记本电脑怎么样? (3认同)

gdi*_*ble 10

特征检测

\n
const isMobile = localStorage.mobile || window.navigator.maxTouchPoints > 1;\n
Run Code Online (Sandbox Code Playgroud)\n
\n

自 2022 年 2 月 7 日起可在 CHROME + SAFARI 中运行 :: 结合功能检测并尝试此线程和其他站点中的所有内容。适用localStorage.mobile于 Chrome 移动版;后者适用于 Safari 移动版。打开或不打开开发工具和/或在移动模拟器上都不会触发桌面浏览器。在撰写本文时,它会触发真正的移动浏览器,但不会触发桌面浏览器。

\n
\n

请考虑

\n

我还在 Win10 上的 Lenovo X1 Yoga(键盘或平板模式)上进行了测试

\n
    \n
  1. localStorage.mobile无论如何undefined
  2. \n
  3. 当笔记本电脑处于键盘模式时:
    window.navigator.maxTouchPointsis 1
    \xe2\x86\x92 isMobile isfalse
  4. \n
  5. 当键盘向后翻转并且笔记本电脑处于平板电脑模式时:
    window.navigator.maxTouchPointsis 10
    \xe2\x86\x92 isMobile istrue
  6. \n
\n


Jef*_*Jak 9

这是一个比匹配更有效的userAgent解决方案......

function _isMobile(){
    // if we want a more complete list use this: http://detectmobilebrowsers.com/
    // str.test() is more efficent than str.match()
    // remember str.test is case sensitive
    var isMobile = (/iphone|ipod|android|ie|blackberry|fennec/).test
         (navigator.userAgent.toLowerCase());
    return isMobile;
}
Run Code Online (Sandbox Code Playgroud)

  • 测试方法不区分大小写,但你的正则表达式是.你可以在最后用"i"标记不区分大小写的正则表达式并执行`/iphone|etc/i.test(navigator.userAgent) (7认同)

stu*_*ujo 8

这样的事怎么样?

if(
    (screen.width <= 640) || 
    (window.matchMedia && 
     window.matchMedia('only screen and (max-width: 640px)').matches
    )
  ){
   // Do the mobile thing
}
Run Code Online (Sandbox Code Playgroud)

  • 窗口分辨率与浏览器是否在移动设备上无关.例如,许多桌面浏览器在非全屏窗口中运行.如果您向这些浏览器提供专为手持屏幕设计的UI,他们的用户将会遇到令人沮丧的体验. (3认同)

The*_*978 7

根据MDN关于使用用户代理进行浏览器检测的文章,建议尽可能避免使用这种方法,并建议其他途径,例如特征检测。

但是,如果必须使用用户代理来检测设备是否可移动,则他们建议:

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

因此,这种单线就足够了:

const isMobileDevice = window.navigator.userAgent.toLowerCase().includes("mobi");

  • 我认为这在没有polyfills的任何地方都可以工作:`const isMobile = /Mobi/.test(window.navigator.userAgent)` (4认同)

Neo*_*ina 7

检测移动设备或平板设备的一种非常好的方法是查看浏览器是否可以创建触摸事件.

纯JavaScript代码:

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

if (isMobile()) {
   # do whatever you wanna do!
}
Run Code Online (Sandbox Code Playgroud)

这对我很有用,但笔记本电脑设备可能存在问题,包括触摸屏显示器.

我不确定触摸屏笔记本电脑是否会被检测为移动设备,因为我还没有测试过它.

  • 触摸屏笔记本电脑将被检测为移动设备.以及台式机的触摸屏显示器.信不信由你,如果你使用触摸屏设备将RDP用于另一台没有触摸屏的设备,你也会遇到问题. (5认同)

Ric*_*iso 7

这是单班轮

function isMobile() {
  return (typeof window.orientation !== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1);
};
Run Code Online (Sandbox Code Playgroud)

  • `window.orientation` 已[弃用](https://developer.mozilla.org/en-US/docs/Web/API/Window/orientation)。不再推荐此功能。尽管某些浏览器可能仍然支持它,但它可能已从相关网络标准中删除,可能正在被删除,或者可能仅出于兼容性目的而保留。避免使用它,并尽可能更新现有代码;请参阅本页底部的兼容性表来指导您的决定。请注意,此功能可能随时停止工作。 (2认同)

J.T*_*lor 6

元素获得焦点后,立即将其模糊。Bootstrap-datepicker是一个非常受欢迎且维护良好的组件,在GitHub中拥有近10,000个星,它使用以下方法:

if (window.navigator.maxTouchPoints || 'ontouchstart' in document) {
    this.input.blur();
}
Run Code Online (Sandbox Code Playgroud)

https://github.com/uxsolutions/bootstrap-datepicker

感谢Tigger的协助。


Lan*_*nti 5

这是我对这个问题的重新思考解决方案.仍然不完美.唯一真正的解决方案是,如果设备制造商开始认真对待"移动"和"平板电脑"用户代理字符串.

window.onload = userAgentDetect;
function userAgentDetect() {
  if(window.navigator.userAgent.match(/Mobile/i)
  || window.navigator.userAgent.match(/iPhone/i)
  || window.navigator.userAgent.match(/iPod/i)
  || window.navigator.userAgent.match(/IEMobile/i)
  || window.navigator.userAgent.match(/Windows Phone/i)
  || window.navigator.userAgent.match(/Android/i)
  || window.navigator.userAgent.match(/BlackBerry/i)
  || window.navigator.userAgent.match(/webOS/i)) {
    document.body.className += ' mobile';
    alert('True - Mobile - ' + navigator.userAgent);
  } else {
    alert('False - Mobile - ' + navigator.userAgent);
  }
  if(window.navigator.userAgent.match(/Tablet/i)
  || window.navigator.userAgent.match(/iPad/i)
  || window.navigator.userAgent.match(/Nexus 7/i)
  || window.navigator.userAgent.match(/Nexus 10/i)
  || window.navigator.userAgent.match(/KFAPWI/i)) {
    document.body.className -= ' mobile';
    document.body.className += ' tablet';
    alert('True - Tablet - ' + navigator.userAgent);
  } else {
    alert('False - Tablet - ' + navigator.userAgent);
  }
}
Run Code Online (Sandbox Code Playgroud)

当Nexus 7平板电脑只有Android UA字符串时会发生什么?首先,移动成为现实,后来平板电脑也成为现实,但平板电脑将从机身标签中删除Mobile UA字符串.

CSS:

body.tablet { background-color: green; }
body.mobile { background-color: red; }
Run Code Online (Sandbox Code Playgroud)

alert为发展添加了线条.Chrome控制台可以模拟许多手持设备.在那里测试.

编辑:

只是不要使用它,而是使用特征检测.有很多设备和品牌,以品牌为目标永远不会是正确的解决方案.


Jos*_*das 5

取决于用例。所有移动设备都需要电池。如果您追求的是在不耗尽电池的情况下计算能力,请使用Battery Status API

navigator.getBattery().then(battery => {
  battery.charging ? 'charging' : 'not charging';
});
Run Code Online (Sandbox Code Playgroud)

如果您要查找的是展示用途matchMedia,它会返回一个布尔值:

if (window.matchMedia("(min-width: 400px)").matches) {
  /* the viewport is at least 400 pixels wide */
} else {
  /* the viewport is less than 400 pixels wide */
}
Run Code Online (Sandbox Code Playgroud)

或者将它们结合起来,在平板设备上获得更好的用户体验。

  • 检查电池,这很聪明 (2认同)

f v*_*f v 5

UserAgent 并非 100% 可靠。

window.navigator.maxTouchPoints > 1;
Run Code Online (Sandbox Code Playgroud)

这已经足够了!它不包括浏览器开发控制台中的手机模拟器。这对我来说很重要。

  • 这不适用于使用 chromebook 等触摸屏的用户。 (3认同)

归档时间:

查看次数:

915899 次

最近记录:

6 年,1 月 前