检测移动浏览器

2023-12-06

我正在寻找一个函数,如果用户是否使用移动浏览器,该函数会返回布尔值。

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

我在看这个网站,但遗憾的是这个脚本是如此神秘,我不知道如何使用它来达到我的目的,即创建一个返回 true/false 的函数。


使用正则表达式(来自检测mobilebrowsers.com):

这是一个使用非常长且全面的正则表达式的函数,它返回一个true or false值取决于用户是否使用移动设备浏览。

window.mobileCheck = function() {
  let 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;
};

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

window.mobileAndTabletCheck = function() {
  let 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;
};

使用 navigator.userAgentData

您还可以使用navigator.userAgentData.mobile, but userAgentData仍处于实验阶段,因此不建议在生产中使用。

const isMobile = navigator.userAgentData.mobile; //resolves true/false

userAgentData 的兼容性图表


原来的答案

您可以通过简单地运行设备列表并检查是否useragent匹配任何类似这样的内容:

  function detectMob() {
    const toMatch = [
        /Android/i,
        /webOS/i,
        /iPhone/i,
        /iPad/i,
        /iPod/i,
        /BlackBerry/i,
        /Windows Phone/i
    ];
    
    return toMatch.some((toMatchItem) => {
        return navigator.userAgent.match(toMatchItem);
    });
}

但是,由于您认为此方法不可靠,因此您可以假设任何分辨率为800x600或者更少也是移动设备,进一步缩小您的目标(尽管现在许多移动设备的分辨率比这高得多)

i.e

  function detectMob() {
    return ( ( window.innerWidth <= 800 ) && ( window.innerHeight <= 600 ) );
  }

参考:

  • 使用 javascript 检测浏览器和设备
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检测移动浏览器 的相关文章

随机推荐

  • 在 Windows 任务计划程序中更改已计划任务的运行时间

    我在修改机器上已存在的任务时遇到问题 我正在尝试使用 C 生成的互操作接口 从 system32 taskschd dll 生成的 Interop TaskScheduler dll 来执行此操作 首先 我无法使用其他库 例如http ta
  • Java try-finally返回设计问题

    在 Java 中 try finally 的执行对我来说有点不直观 正如另一个问题中所说明的 Java中finally总是执行吗 如果try块中有return语句 如果定义了finally块 它将被忽略 例如 函数 boolean test
  • Android:如何在应用程序中集成admob?

    我试图将 admob 横幅集成到我的应用程序中几个小时 但我做不到 所以我创建了新的应用程序 其唯一目的是显示 admob 横幅 但它也不起作用 这是代码 public class MainActivity extends Activity
  • 如何以编程方式从 Windows 手机访问 SMS 消息线程 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想访问 Windows Phone 上的所有消息并备份它或在 PC 手机上复制它 我搜索了这个 但无法在互联网上找到它 有没有可用的 API 来实现这一点 这仅适用于 Wind
  • Breezejs 与保存包有关的问题

    我使用breezejs 我的应用程序的服务器端代码是 net 在我看来 客户端 我想添加实体 然后我想保存它 让我们假设一个实体是这样的 Id 1 Name someName CreatedDate 1900 01 01T05 00 00Z
  • TreeView 重新获得 Ctrl+Click 的焦点

    我有一个 WinForms TreeView 控件 我想用它来根据当前选择的节点打开另一个窗体 我想在按住 Ctrl 键并单击节点时打开另一个窗体 目前 如果我在 DoubleClick 处理程序中打开另一个表单 显然是双击该节点 它就会按
  • 应用速率大于 2 倍时,avplayer 播放时出现抖动

    我想调整 Avplayer 速率 我可以在以下帮助下完成 avplayer play avplayer setRate 1 5 还禁用了音轨 低于2 0时运行良好 但当我们应用它超过 2 倍时 就会导致视频不稳定或不稳定 当我用谷歌搜索这一
  • 如何在 OpenEdge SQL 中模拟 SELECT ... LIMIT、OFFSET?

    在大多数 SQL 实现中 能够选择查询中返回的所有行的 滑动窗口 子集是很常见的事情 一个常见的用例是分页 例如 假设我有一个搜索页面 每页有 10 个结果 对于支持的实现LIMIT and OFFSET关键字 用于返回每个页面结果的查询如
  • IE8 不透明度问题

    我尝试解决IE8中出现的问题 Html 非常简单 div div div div div div div div 当我在 IE 中设置 使用 jQuery source 元素的不透明度为 0 时 我可以看到 overlay 的背景 而不是
  • 有没有办法查询未来的SSRS订阅时间表?

    在我的办公室 我们中的许多人都使用 SSRS 来安排定期报告 我想查看接下来几天或一周内即将运行的报表的时间表 以便我们可以了解 20 个报表是否都将尝试同时运行 我怎样才能做到这一点 我创建了显示订阅信息的 t sql 报告 但它们仅显示
  • 从 javascript 中的对象数组中删除重复值[重复]

    这个问题在这里已经有答案了 我有一个像这样的对象数组 arr label Alex value Ninja label Bill value Op label Cill value iopop 该数组是在渲染我的反应组件时组成的 第 i 个
  • 如何在代码中为树视图设置 WPF 数据模板?

    struct Drink public string Name get private set public int Popularity get private set public Drink string name int popul
  • C# - 使用 StreamReader 并行化 While 循环会导致 CPU 过高

    SemaphoreSlim sm new SemaphoreSlim 10 using FileStream fileStream File OpenRead using StreamReader streamReader new Stre
  • java中exec()方法的重定向

    我没有得到正确的答案 我的代码是 String s java classpath MiniRA RegAlloc lt MiniRA 4 miniIR Process pro2 Runtime getRuntime exec s Syste
  • API SurveyQuestionImage.Data 字段的正确格式是什么?

    我正在使用 GCS API 尝试使用图像数据创建调查 我在 Net 平台上使用 NuGet 包 Google Apis ConsumerSurveys v2 版本 1 14 0 564 我可以毫无问题地创建不包含图像数据的调查 但是 当我尝
  • 过滤后无法返回子类对象的Stream

    我有一个方法返回一个Stream类型的A 我也有一个亚型B of A 该方法创建一个Stream它填充了以下实例B 它们也是类型A由于继承 这工作得很好 直到我在上面引入一个过滤器Stream 然后 编译器决定 Stream 的类型B并不是
  • PHP:如何访问函数内部已在函数外部声明的变量?

    在每个页面的开头 我包含一个启动会话等的文件 我们称之为session php 在这个文件中session php 我包含一个包含函数的文件 我们称之为function1 php 因为我需要该功能可用session php 但是 稍后在主页
  • Groovy 中的类转换异常

    我想使用 grails 上的 groovy 上传图像 我的gsp页面如下 我显示的是原始的简化版本
  • XSD 断言无法识别

    我有一个 XSD 我想在其中使用xs assert陈述 问题是我不知道如何使断言功能可供我使用 我正在使用 Visual Studio 编写它 它会出现一条蓝线 表示它不支持断言元素 我的 XSD 看起来像这样
  • 检测移动浏览器

    我正在寻找一个函数 如果用户是否使用移动浏览器 该函数会返回布尔值 我知道我可以使用navigator userAgent并使用正则表达式编写该函数 但用户代理对于不同的平台来说太多样化了 我怀疑匹配所有可能的设备会很容易 而且我认为这个问