最近ios发布新版本系统12.1,随着部分用户的系统更新,一些问题也渐渐暴露出来。。。ios
公司作个活动页,在ios系统中弹出登陆界面,在键盘弹出再收起后,反应点击区域会无效浏览器
在H5端是无法监控键盘的弹出与收起的,resize事件触发的机型极其有限,况且我在ios中实测没有触发,安卓反而能够。由于安卓弹起键盘时会修改视窗的大小,可是ios并不会,若是你在ios上设置一个100%高度的body,弹起键盘后你会发现这个body是能够上下滚动的,即100%高度的body超出了视窗。app
如图所示,点击输入手机号以后,在收起键盘以后,验证码输入框点击区域都不触发事件了,若是往手机号上面的视图区域再点击,会触发验证码等点击事件iphone
推测是body没有正确从新渲染,致使点击事件不处于body内而没法触发。因此再正确推回来应该就能够解决了测试
(/iphone|ipod|ipad/i.test(navigator.appVersion)) && document.addEventListener('blur', (e) => { document.body && (document.body.scrollTop = document.body.scrollTop); }, true)
在input输入框失去焦点的钩子中设置滚动到原有位置(document.body.scrollTop = document.body.scrollTop)
,触发浏览器的重绘,使的错误的渲染回复正常,滚动位置也不会有改变,没有影响体验。3d
觉得问题就此解决,可是又有新的问题,若是点击手机号输入框以后,再点击验证码输入框,视图会往下又立马往上,感受体验有点怪怪的。code
修改代码blog
var iscanscrollpage = false; (/iphone|ipod|ipad/i.test(navigator.appVersion)) && document.addEventListener('blur', (e) => { // 这里加了个类型判断,由于a等元素也会触发blur事件 if(['input', 'textarea'].includes(e.target.localName)) { iscanscrollpage = true; setTimeout(function() { if(iscanscrollpage) { document.body && (document.body.scrollTop = document.body.scrollTop); } }, 200); } }, true) $("#userphone").focus(function() { iscanscrollpage = false; }); $("#logincode").focus(function() { iscanscrollpage = false; });
延迟200ms执行,主要用iscanscrollpage来判断是否切换输入了输入框,测试解决问题。事件
补充:用document.body.scrollIntoView(false)方法也能够ip