关于移动端的键盘兼容性总结

这是第一个移动端子应用中遇到的问题。由于自己以前从来没有做过移动端相关的开发。这次开发遇到了很多IOS和Android的系统差异需要做的兼容问题。在这里总结一下。以后遇到相关的兼容问题也来这里更新。首先我们来看一下IOS和Android的不同之处。

页面不同之处

  • IOS:在ios中软键盘弹起时,仅会引起$(‘body’).scrollTop值改变。
  • Android:在android中软键盘弹起或收起时,会改变window的高度。

焦点的不同之处

  • IOS:IOS收起键盘后,输入框就会自动失去焦点
  • Android:Android中会存在收起键盘后,输入框并没有失去焦点的情况。

监听软键盘的弹起与收回

综上所述,如果我们想要监听键盘事件,就必须根据不同的机型来做兼容。

  • IOS:可以通过监听输入框的 focus 和 blur 事件来实现监听。
// focusin和focusout支持冒泡,对应focus和blur, 使用focusin和focusout的原因是focusin和focusout可以冒泡,
// focus和blur不会冒泡,这样就可以使用事件代理,处理多个输入框存在的情况。
onst isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
 document.body.addEventListener('focusin', () => {
            //软键盘弹出的事件处理
            if(isIOS){

            }
        })
  document.body.addEventListener('focusout', () => {
       //软键盘收起的事件处理
        if(isIOS){

        }
   })
  • Android:由于某些 Android 手机收起键盘,输入框不会失去焦点,所以不能通过聚焦和失焦事件来判断。但由于窗口会变化,所以可以通过监听窗口高度的变化来间接监听键盘的弹起与收回。
 const isAndroid = /(Android)/i.test(navigator.userAgent);
      if (isAndroid) {
        window.addEventListener("resize", () => {
          var resizeHeight =
            document.documentElement.clientHeight || document.body.clientHeight;
          // Document 对象的activeElement 属性返回文档中当前获得焦点的元素。
          if (resizeHeight - 0 < originalHeight - 0) {
            //当软键盘弹起,在此处操作
          } else {
            //当软键盘收起,在此处操作
          }
        });
      }

问题一:IOS软键盘收起后导致页面上移一部分导致的底部空白。

  • 问题原因:微信6.4.7和IOS对键盘弹出做了处理。
  • 解决代码:监听输入框的失焦事件,在事件里添加以下代码。
 const u = navigator.userAgent;
      const isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
      if (isIOS) {
        setTimeout(() => {
          const scrollHeight =
            document.documentElement.scrollTop || document.body.scrollTop || 0;
          window.scrollTo(0, Math.max(scrollHeight - 1, 0));
        }, 100);
      }

问题二: Android手机底部输入框被软键盘挡住,以及键盘收起输入框不失去焦点问题。

const isAndroid = /(Android)/i.test(navigator.userAgent);
      if (isAndroid) {
        window.addEventListener("resize", () => {
          var resizeHeight =
            document.documentElement.clientHeight || document.body.clientHeight;
          // Document 对象的activeElement 属性返回文档中当前获得焦点的元素。
          if (resizeHeight - 0 < originalHeight - 0) {
            //当软键盘弹起,在此处操作
            if (document.activeElement.tagName === "TEXTAREA" ||
                document.activeElement.tagName === "INPUT") {
              setTimeout(() => {
                // 将获得焦点元素滚动到页面中
                document.activeElement.scrollIntoViewIfNeeded();
              }, 0);
            }
          } else {
            //当软键盘收起,在此处操作
            document.activeElement.blur();
          }
        });
      }

解决 IOS 上面关于点击输入框弹出键盘迟缓的问题

在 vue 中使用了 fastClick 后,测试发现在某些ios上,点击输入框想调起软键盘,触点不是很灵敏,必须重压或长按才能成功调起。
解决方法:在main.js中重写 fastclik 的 focus方法就可以了

FastClick.prototype.focus = function(targetElement) {
  let length;
  if (
    !!ua.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) &&
    targetElement.setSelectionRange &&
    targetElement.type.indexOf("date") !== 0 &&
    targetElement.type !== "time" &&
    targetElement.type !== "month"
  ) {
    length = targetElement.value.length;
    targetElement.focus(); // fastclick源码没有这一句。
    targetElement.setSelectionRange(length, length);
  } else {
    targetElement.focus();
  }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 本文转载自wuwhs的segmentfault专栏 最近一段时间在做 H5 聊天项目,踩过其中一大坑:输入框获取焦...
    兔子不打地鼠打代码阅读 9,624评论 1 12
  • 可能这些是你想要的H5软键盘兼容方案 前言 输入框获取焦点,软键盘弹起,要求输入框吸附(或顶)在输入法框上。需求很...
    记住了_叶阅读 776评论 0 2
  • 转载 1. 问题描述: 最近一段时间在做 H5 项目,踩过其中一大坑:输入框获取焦点,软键盘弹起,要求输入框吸附(...
    星空里的尘埃阅读 651评论 0 2
  • 之前在做H5 项目,踩过其中一大坑:输入框获取焦点,软键盘弹起,要求输入框吸附(或顶)在输入法框上。需求很明确,看...
    超级无敌可爱的阅读 2,197评论 0 3
  • 在 Android 和 IOS 上,获知软键盘弹起和收起状态存在差异,且页面 webview 表现不同。 软键盘弹...
    李霖弢阅读 2,973评论 0 0