在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
问题症状 今天在开发一个移动端的 H5 页面时,遇到了 IOS 上键盘收起时界面无法归位的问题。下面详细描述下问题和症状: 页面结构 出问题的页面是一个表单结构。即类似于一个 div 下有4个 input 表单的结构,用于用户填写邮寄信息。类似: <div> <input type="text" placeholder="请填写省市县" /> <input type="text" placeholder="请填写地址" /> <input type="text" placeholder="请填写姓名" /> <input type="text" placeholder="请填写联系电话" /> </div> 截图如下: 键盘弹起时页面自动上移 当用户在手机上输入联系电话时,IPhone键盘会弹出,此时iphone上为了让用户可以看到电话输入框,会将整个页面整体向上移动(不然键盘会遮住电话输入框)。此时,实际上页面顶部是离开了我们的视口一部分距离的(我们看到界面中消失了一行输入框)。 键盘收起时页面无法还原归位 然而当用户输入完成关闭键盘后,键盘虽然收起了,但页面位置却不会还原。 问题分析 实际上这是由于 IOS 无法在键盘收起时,页面滚出视口的部分没有掉下来导致的。这时用户是可以通过手指将页面拖回来的。 要解决这个问题,我们可以在用户光标离开输入框的时候,调用 那么现在问题就是要给表单中 4 个输入框全部加上 blur 事件,然后在 handler 中调用 事件代理 即,我们把事件监听放到顶部元素上;然后定义一个 inputBlur 的函数等待触发。 <div @blur="inputBlur"> <input type="text" placeholder="请填写省市县" /> <input type="text" placeholder="请填写地址" /> <input type="text" placeholder="请填写姓名" /> <input type="text" placeholder="请填写联系电话" /> </div> 结果,发现我们的事件监听器无法触发。原因经查是输入框的 无法冒泡的解决方案 经过查询,发现 网上一些文章提到 所以,果断通过这两个事件解决问题,我们改成 <div @focusout="inputBlur"> <input type="text" placeholder="请填写省市县" /> <input type="text" placeholder="请填写地址" /> <input type="text" placeholder="请填写姓名" /> <input type="text" placeholder="请填写联系电话" /> </div> 然后,实现我们的事件处理器: inputBlur(e) { // 首先,判断触发事件的目标元素是否是input输入框,我们只关注输入框的行为。 if (e && e.target && e.target.tagName && e.target.tagName.toLowerCase() === 'input') { window.scrollTo(0,0); } }, 这时,我们问题得到解决了,当从输入框输入内容,然后点击键盘的完成收起键盘,效果符合我们的预期。 但是经过手机测试发现,当我们从 解决抖动问题 其实2个输入框切换时 抖动的原因也很简单。因为我们在上述两个输入框之间切换时,页面会首先触发 其实,在两个输入框之间切换这种操作时,我们就没必要触发第一个输入框 blur 时的 <div @focusout="inputBlur" @focusin="inputFocus"> <input type="text" placeholder="请填写省市县" /> <input type="text" placeholder="请填写地址" /> <input type="text" placeholder="请填写姓名" /> <input type="text" placeholder="请填写联系电话" /> </div> inputBlur(e) { // 首先,判断触发事件的目标元素是否是input输入框,我们只关注输入框的行为。 if (e && e.target && e.target.tagName && e.target.tagName.toLowerCase() === 'input') { // 输入框失去焦点,要把IOS键盘推出页面的滚动部分还原。即将页面滚动到视窗顶部对齐 console.log('设置timer') this.timer = setTimeout(() => { console.log('timer触发') window.scrollTo(0,0); }, 0) } }, inputFocus(e) { // 如果focus,则移除上一个输入框的timer if (e && e.target && e.target.tagName && e.target.tagName.toLowerCase() === 'input') { clearTimeout(this.timer); } } 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持极客世界。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论