总结几个移动端H5软键盘的大坑

开发 前端
Element.scrollIntoViewIfNeeded()方法也是用来将不在浏览器窗口的可见区域内的元素滚动到浏览器窗口的可见区域。但如果该元素已经在浏览器窗口的可见区域内,则不会发生滚动。

1. 部分机型软键盘弹起挡住原来的视图

解决方法:可以通过监听移动端软键盘弹起。

Element.scrollIntoView() 方法让当前的元素滚动到浏览器窗口的可视区域内。参数如下:

  • true,表示元素的顶部与当前区域的可见部分的顶部对齐
  • false,表示元素的底部与当前区域的可见部分的尾部对齐

[[319677]]

Element.scrollIntoViewIfNeeded()方法也是用来将不在浏览器窗口的可见区域内的元素滚动到浏览器窗口的可见区域。但如果该元素已经在浏览器窗口的可见区域内,则不会发生滚动。此方法是标准的Element.scrollIntoView()方法的专有变体。

  1. window.addEventListener('resize', function() { 
  2.   if (document.activeElement.tagName === 'INPUT' || document.activeElement.tagName === 'TEXTAREA') { 
  3.     window.setTimeout(function() { 
  4.       if ('scrollIntoView' in document.activeElement) { 
  5.         document.activeElement.scrollIntoView(false) 
  6.       } else { 
  7.         document.activeElement.scrollIntoViewIfNeeded(false) 
  8.       } 
  9.     }, 0) 
  10.   } 
  11. }) 

2. ios 键盘收起时页面没有回落,底部会留白

部分苹果手机填写表单的时候的,输入内容后关闭软键盘,底部会留一块空白。这种情况可以通过监听键盘回落时间滚动到原来的位置。

  1. window.addEventListener('focusout', function() { 
  2.   window.scrollTo(0, 0) 
  3. }) 
  4.  
  5. //input输入框弹起软键盘的解决方案。 
  6. var bfscrolltop = document.body.scrollTop 
  7. $('input') 
  8.   .focus(function() { 
  9.     documentdocument.body.scrollTop = document.body.scrollHeight 
  10.     //console.log(document.body.scrollTop); 
  11.   }) 
  12.   .blur(function() { 
  13.     document.body.scrollTop = bfscrolltop 
  14.     //console.log(document.body.scrollTop); 
  15.   }) 

3. onkeyUp 和 onKeydown 兼容性问题

部分 ios 机型 中 input 键盘事件 keyup、keydown、等支持不是很好, 用 input 监听键盘 keyup 事件,在安卓手机浏览器中没有问题,但是在 ios 手机浏览器中用输入法输入之后,并未立刻相应 keyup 事件:

  • onkeypress 用户按下并放开任何字母数字键时发生。系统按钮(箭头键和功能键)无法得到识别。
  • onkeyup 用户放开任何先前按下的键盘键时发生。
  • onkeydown 用户按下任何键盘键(包括系统按钮,如箭头键和功能键)时发生。

4. ios12 输入框难以点击获取焦点,弹不出软键盘

定位找到问题是 fastclick.js 对 ios12 的兼容性,可在 fastclick.js 源码或者 main.js 做以下修改:

  1. FastClick.prototype.focus = function(targetElement) { 
  2.   var length 
  3.   if (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month') { 
  4.     length = targetElement.value.length 
  5.     targetElement.setSelectionRange(length, length) 
  6.     targetElement.focus() 
  7.   } else { 
  8.     targetElement.focus() 
  9.   } 

5. fastclick 导致下拉框焦点冲突

移动端使用 fastclick 之后,在 ios 环境下,有几个连续的下拉框 第一个 select 框突然填充了第二个下拉框的内容。

根本原因是 Fastclick 导致 ios 下多个 select ,点击某一个,焦点不停变换的 bug。修改源码,在 onTouchStart 事件内判断设备是否为 ios,再判断当前 nodeName 是否为 select,如果是 return false 去阻止 fastClick 执行其他事件。

  1. //line 391行 
  2. FastClick.prototype.onTouchStart = function(event) { 
  3.   //在其方法中添加判断 符合ios select的时候 不返回事件 
  4.   if (deviceIsIOS && this.targetElement == 'select') this.targetElement = null 
  5.   event.preventDefault() 
  6. //line521 或者讲源码中 有关touchEnd判断非ios或者非select的事件注释, 
  7. if (!deviceIsIOS || targetTagName !== 'select') { 
  8.   this.targetElement = null 
  9.   event.preventDefault() 

6. ios 下 fixed 失效的原因

软键盘唤起后,页面的 fixed 元素将失效,变成了 absolute,所以当页面超过一屏且滚动时,失效的 fixed 元素就会跟随滚动了。不仅限于 type=text 的输入框,凡是软键盘(比如时间日期选择、select 选择等等)被唤起,都会遇到同样地问题。

解决方法: 不让页面滚动,而是让主体部分自己滚动,主体部分高度设为 100%,overflow:scroll

  1. <body> 
  2.   <div class='warper'> 
  3.     <div class='main'></div> 
  4.   <div> 
  5.   <div class="fix-bottom"></div> 
  6. </body>
  1. .warper { 
  2.   position: absolute; 
  3.   width: 100%; 
  4.   left: 0; 
  5.   right: 0; 
  6.   top: 0; 
  7.   bottom: 0; 
  8.   overflow-y: scroll; 
  9.   -webkit-overflow-scrolling: touch; /* 解决ios滑动不流畅问题 */ 
  10. .fix-bottom { 
  11.   position: fixed; 
  12.   bottom: 0; 
  13.   width: 100%; 

7. ios 键盘换行变为搜索

  • input type="search"
  • input 外面套 form,必须要有 action,action="javascript:return true"
  • 表单提交阻止默认提交事件
  1. <form action="javascript:return true" @submit.prevent="formSubmit"> 
  2.   <input type="search" placeholder="请输入诉求名称" id="search" /> 
  3. </form> 

 

责任编辑:赵宁宁 来源: 前端先锋队
相关推荐

2019-04-25 10:20:22

H5软键盘前端

2022-10-26 09:01:55

H5移动端调试

2021-06-23 06:30:14

H5 移动端前端开发

2009-08-21 13:25:49

C#打开软键盘

2024-03-06 09:16:57

PAD设备kikaInput鸿蒙

2021-08-07 15:31:45

Windows 10Windows微软

2015-12-03 15:27:46

2015-12-03 10:47:49

2015-12-16 12:40:32

H5缓存机制移动

2024-05-06 08:28:09

Android窗口键盘

2024-04-11 10:02:06

iOS键盘Android

2017-12-05 15:26:19

2017-12-05 13:12:35

Android软键盘参数

2015-07-15 14:38:54

H5移动适配

2015-07-15 12:30:37

移动端H5高清多屏

2021-07-13 09:49:08

鸿蒙HarmonyOS应用

2013-06-27 17:26:01

AndroidEditText

2017-08-16 10:57:25

H5HTML开发

2017-07-03 17:20:55

Android软键盘控制开发问题

2021-04-27 07:52:19

C++promisefuture
点赞
收藏

51CTO技术栈公众号