- 当前 Bug 的表现(可附上截图)
- 预期表现
- 复现路径
用iphone手机在微信6.7.4版本上随便进一个有表单的h5页面试一下就可以复现
应该是进入有 web-view 组件后拉起系统键盘或 picker 消失后会导致页面 contentSize 有变化,需要用户主动滚动页面才能恢复。
这个是微信 6.7.4 使用 XCode10 打包后引入的系统 bug,我们会在 6.7.5 版本上线兼容逻辑,规避大部分有问题的情况。这个 bug 已经提交到苹果那边了,看他们何时会发布系统修复版本吧。
这个应该算是苹果系统的一个bug,当键盘收起后不会自动重绘body,需要手动滑动一下才能恢复正常。前端可以使用document.body.scrollIntoView()来解决。这里是scrollIntoView()的详细介绍:https://developer.mozilla.org/zh-CN/docs/Web/API/Element/scrollIntoView具体代码块如下:
// ios键盘弹起收回body不会重绘
|
可以全局监听一下 focusout 事件,毕竟不可能每个 input 里面都写一次 blur 监听,这对于以后的维护也不是很友好,而 focusout 与 blur 的不同之处是 focusout 可以冒泡。但是如果你的页面里有弹窗,那么你可能需要 setTimeout 一下。哦!页面卸载的时候记得移除监听。
window.addEventListener('focusout', fixScrollTop) |
上午解决的。
判断下iOS设备。执行下面代码,用的事件委托,每次输入框或者下拉框离开焦点时,触发一下页面重绘
inputBlur () { let $view = document.querySelector( '.yd-scrollview' ); if (!$view) return ; $view.setAttribute( 'tabIndex' , 1); $view.addEventListener( 'blur' , function (e) { if ([ 'INPUT' , 'SELECT' ].indexOf(e.target.tagName) > -1) { document.body && (document.body.scrollTop = document.body.scrollTop); } }, true ); }, |
虽然 blur 并不能冒泡,但addEventListener第三个参数设置为true即可。
如果是jQuery,那事件委托就更简单了
$(document).ready( function (){ ( function (){ let scroll_top = 0; let input_focus= false ; $(document).on( "focus" , "input,select,textarea" ,()=>{ input_focus= true ; scroll_top = $(document).scrollTop(); }); $(document).on( "blur" , "input,select,textarea" ,()=>{ input_focus= false ; setTimeout( function (){ if (!input_focus){ $(document).scrollTop(scroll_top); } },100); }); }()); }); |