js判断当前设备是否为移动端

背景

响应式布局:随着移动互联网的发展,用户通过手机和平板访问网页的比例越来越高。为了提供更好的用户体验,开发者需要根据设备类型调整页面布局、字体大小、图片尺寸等,以确保在不同屏幕尺寸上都有良好的显示效果。
交互方式差异:移动设备和桌面设备的交互方式有很大不同(例如触控屏 vs 鼠标点击),因此需要针对不同的交互方式进行适配。

编码实战

/**
 * 判断当前设备是否为移动设备(包括手机、平板、微信小程序 WebView 等)
 * @returns {boolean} 是否为移动端
 */
function isMobileDevice() {
  // 获取浏览器的 User-Agent 字符串,用于识别操作系统、浏览器类型等信息
  const ua = navigator.userAgent || navigator.vendor || window.opera;

  /**
   * 检测是否是常见的移动设备
   * 匹配关键词:Android、iPhone、iPad、iPod、BlackBerry、webOS、Windows Phone、SymbianOS、IEMobile、Opera Mini
   * 适用于大多数主流手机和平板设备
   */
  const isMobile = /Android|iPhone|iPad|iPod|BlackBerry|webOS|Windows Phone|SymbianOS|IEMobile|Opera Mini/i.test(ua);

  /**
   * 检测是否是平板设备(如 iPad、Kindle Fire、黑莓 PlayBook 等)
   * 特别处理了 Amazon Fire 平板的特征码 KFxxx
   * 注意:iPadOS 在桌面 Safari 中 UA 可能显示为 Macintosh,所以补充了 touch 关键词检测
   */
  const isTablet = /ipad|playbook|silk|(android.*\bkf[a-z]{2,6}\b)|kindle|macintosh.*touch/i.test(ua);

  /**
   * 检测设备是否支持触控屏
   * 使用多种方式兼容不同浏览器:
   - 'ontouchstart' in window:标准触控事件是否存在
   - navigator.maxTouchPoints:多点触控支持数量(现代浏览器)
   - navigator.msMaxTouchPoints:IE 和旧版 Edge 兼容
   */
  const hasTouchScreen = (
    ('ontouchstart' in window) ||
    (navigator.maxTouchPoints > 0) ||
    (navigator.msMaxTouchPoints > 0)
  );

  /**
   * 判断是否是 PC 端的微信环境(用于后续排除 PC 微信误判)
   * 如果 UA 中包含 Windows NT 或 Macintosh,则认为是桌面端微信
   */
  const isPcInWeChat = /Windows NT|Macintosh/.test(ua);

  /**
   * 判断是否是微信内置浏览器或小程序 WebView
   * 但需要排除 PC 微信的情况(否则可能误判为移动端)
   */
  const isWeChatWebView = /micromessenger/i.test(ua) && !isPcInWeChat;

  /**
   * 判断是否是从微信小程序加载的 Web 页面(可选)
   * 小程序加载 web-view 时可以通过 URL 参数传递标志位
   * 示例:<web-view src="https://yourdomain.com/page?from=miniprogram" />
   */
  const isInMiniProgram = /from=miniprogram/.test(window.location.search);

  /**
   * 最终判断逻辑:
   * 满足以下任意条件即判定为“移动端”:
   *
   * 1. 是常见移动设备(如 Android、iPhone)
   * 2. 是平板设备(如 iPad、Kindle)
   * 3. 支持触控屏,并且窗口宽度小于 1024px(模拟移动端体验)
   * 4. 是微信小程序 WebView(非 PC 环境)
   * 5. 是从微信小程序加载的页面(通过 URL 参数识别)
   */
  return isMobile || isTablet || (hasTouchScreen && window.innerWidth < 1024) || isWeChatWebView || isInMiniProgram;
}

无注释版本

function isMobileDevice() {
  const ua = navigator.userAgent || navigator.vendor || window.opera;

  const isMobile = /Android|iPhone|iPad|iPod|BlackBerry|webOS|Windows Phone|SymbianOS|IEMobile|Opera Mini/i.test(ua);
  const isTablet = /ipad|playbook|silk|(android.*\bkf[a-z]{2,6}\b)|kindle|macintosh.*touch/i.test(ua);
  const hasTouchScreen = (('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0));
  
  const isPcInWeChat = /Windows NT|Macintosh/.test(ua);
  const isWeChatWebView = /micromessenger/i.test(ua) && !isPcInWeChat;

  const isInMiniProgram = /from=miniprogram/.test(window.location.search); // 如果你控制了 URL

  return isMobile || isTablet || (hasTouchScreen && window.innerWidth < 1024) || isWeChatWebView || isInMiniProgram;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值