问题描述
详细情况可参考链接 可能这些是你想要的H5软键盘兼容方案
- 在 Android 和 IOS 上,获知软键盘弹起和收起状态存在差异,且页面 webview 表现不同。
- 在IOS12 上,微信版本 v6.7.4 及以上,输入框获取焦点,键盘弹起,页面(webview)整体往上滚动,当键盘收起后,不回到原位,导致键盘原来所在位置是空白的。
- 在 IOS 上,使用第三方输入法,高度计算存在偏差,导致在有些输入法弹起,将输入框挡住一部分。
- 在有些浏览器上使用一些操作技巧,还是存在输入框被输入法遮挡。
解决方案
- 在 IOS 上,监听输入框的 focus 事件来获知软键盘弹起,监听输入框的 blur 事件获知软键盘收起。
- 在 Android 上,监听 webview 高度会变化,高度变小获知软键盘弹起,否则软键盘收起。
// 判断设备类型var judgeDeviceType = function () {var ua = window.navigator.userAgent.toLocaleLowerCase();var isIOS = /iphone|ipad|ipod/.test(ua);var isAndroid = /android/.test(ua);return {isIOS: isIOS,isAndroid: isAndroid}}()// 监听输入框的软键盘弹起和收起事件function listenKeybord($input) {if (judgeDeviceType.isIOS) {// IOS 键盘弹起:IOS 和 Android 输入框获取焦点键盘弹起$input.addEventListener('focus', function () {console.log('IOS 键盘弹起啦!');// IOS 键盘弹起后操作}, false)// IOS 键盘收起:IOS 点击输入框以外区域或点击收起按钮,输入框都会失去焦点,键盘会收起,$input.addEventListener('blur', () => {console.log('IOS 键盘收起啦!');// IOS 键盘收起后操作})}// Andriod 键盘收起:Andriod 键盘弹起或收起页面高度会发生变化,以此为依据获知键盘收起if (judgeDeviceType.isAndroid) {var originHeight = document.documentElement.clientHeight || document.body.clientHeight;window.addEventListener('resize', function () {var resizeHeight = document.documentElement.clientHeight || document.body.clientHeight;if (originHeight < resizeHeight) {console.log('Android 键盘收起啦!');// Android 键盘收起后操作} else {console.log('Android 键盘弹起啦!');// Android 键盘弹起后操作}originHeight = resizeHeight;}, false)}}var $inputs = document.querySelectorAll('.input');for (var i = 0; i < $inputs.length; i++) {listenKeybord($inputs[i]);}
// 获取到焦点元素滚动到可视区function activeElementScrollIntoView(activeElement, delay) {var editable = activeElement.getAttribute('contenteditable')// 输入框、textarea或富文本获取焦点后没有将该元素滚动到可视区if (activeElement.tagName == 'INPUT' || activeElement.tagName == 'TEXTAREA' || editable === '' || editable) {setTimeout(function () {activeElement.scrollIntoView();}, delay)}}// ...// Android 键盘弹起后操作activeElementScrollIntoView($input, 1000);
唤起纯数字键盘
<p>请输入手机号</p><input type="tel" novalidate="novalidate" pattern="[0-9]*" class="input">
