移动端开发遇到的问题汇总(一)

375 阅读3分钟

本篇文章记录前端在移动端开发过程中遇到的各种问题,持续更新中~

1. 判断设备类型

  var u = window.navigator.userAgent// 返回当前浏览器的用户代理
  var p = window.navigator.platform// 返回一个字符串,表示浏览器所在的系统平台类型
  window.browserVersion = { //移动终端浏览器版本信息  
    trident: u.indexOf('Trident') > -1, //IE内核 
    ie11:  u.indexOf('Trident') > -1 && u.indexOf('rv:11.0') > -1,//ie11
    ie10:  u.indexOf('Trident') > -1 && u.indexOf('MSIE 10.0') > -1, //ie10
    presto: u.indexOf('Presto') > -1, //opera内核  
    webkit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核  
    chrome: u.indexOf("Chrome") > -1, //谷歌
    gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核  
    safari: u.indexOf('Safari') > -1 && u.indexOf('Chrome') == -1 && u.indexOf('Baidu') == -1, //Safari浏览器
    mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端  
    ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端  
    android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或uc浏览器  
    iphone: u.indexOf('iPhone') > -1, //是否为iPhone或者QQHD浏览器  
    ipad: u.indexOf('iPad') > -1, //是否iPad  
    ipadpro:false,
    webapp: u.indexOf('Safari') == -1, //是否web应用程序,没有头部与底部  
    weixin: u.indexOf('MicroMessenger') > -1,
    qq: u.indexOf('QQ') > -1,

    language: navigator.browserLanguage || navigator.language,

    macos: (p == 'Mac68K') || (p == 'MacPPC') || (p == 'Macintosh') || (p == 'MacIntel'),
    windows: (p == 'Win32') || (p == 'Win64') || (p == 'Windows'),
    win7before: (u.indexOf('Windows NT 5.0') > -1) ||
      (u.indexOf('Windows 2000') > -1) ||
      (u.indexOf('Windows NT 5.1') > -1) ||
      (u.indexOf('Windows XP') > -1) ||
      (u.indexOf('Windows NT 5.2') > -1) ||
      (u.indexOf('Windows 2003') > -1) ||
      (u.indexOf('Windows NT 6.0') > -1) ||
      (u.indexOf('Windows Vista') > -1)
  }
  if(window.browserVersion.android){
    window.browserVersion.mobile=true;
  }
  if(navigator.maxTouchPoints && navigator.maxTouchPoints > 2 && window.browserVersion.macos===true){
    window.browserVersion.ios=true;
    window.browserVersion.mobile=true;
    window.browserVersion.ipadpro=true;
    window.browserVersion.macos=false;
  }

注意:navigator虽然是只读的,但是用户是可以通过修改设备信息来篡改其内容的,这些情况不做考虑。

2. 安卓手机软键盘弹出后遮挡输入框

// 判断是否是安卓设备的方法如上
  if(isAndroid) {
   window.addEventListener("resize"function() {
      if(document.activeElement.tagName=="INPUT" || document.activeElement.tagName=="TEXTAREA") {
      // 为了解决有些机器打开比较慢的情况
         window.setTimeout(function() {
            document.activeElement.scrollIntoViewIfNeeded();
            // 或者这种写法 document.activeElement.scrollIntoView({behavior: 'smooth', block: 'end', inline: 'nearest'});
         },0);
      }
   })
}

注意:该方法可以解决一部分问题,还有很多与输入法、浏览器、webView有关,比如有的输入法弹出的时候不会自动滚动,但是输入第一个字符的时候就会滚动到对应的位置,有的浏览器在键盘弹出的时候不会触发resize等。所以在设计的时候尽量避免输入框在下面的设计。

编辑自2021-3-23,持续更新中~