在H5的开发中避免不了会有在页面加载后,让页面中的输入框自动获取焦点的需求。就像 搜索引擎 打开后搜索框就已经聚焦了。
input 输入框获取焦点的表现
自动聚焦关键属性:
autofocus,也可以手动 调用 focus() 事件
主流的 Safari 和 IOS Webview并不支持该属性,其他主流平台均支持;
对于不支持的 IOS端 要如何解决?
以下内容仅是针对 ios端 webview
H5手动触发
有效果,但不是 100% 生效;一些主流的UI框架如vant在文档中明确标注:Field 组件focus ios不支持;所以仅靠H5端focus并不靠谱,需要客户端配合双管齐下。
// vue项目下,仅供参考
$nextTick(() => {
input.focus()
})
通过客户端 hooks 解决
前提:input 仍需设置 autofocus 属性,客户端仅是来支持H5所设置的 autofocus
首先要了解 ios端两种 webview 类型
- UIWebView
- 支持版本:
- iOS 2.0–12.0
- iPadOS 2.0–12.0
- 文档明确标注,已废弃
- 支持版本:
- WKWebview
- 支持版本:
- iOS 8.0+
- iPadOS 8.0+
- macOS 10.10+
- Mac Catalyst 13.1+
- 目前通用
- 支持版本:
UIWebView 已废弃
- UIWebView 设置 keyboardDisplayRequiresUserAction
// UIWebView // 该属性作用:指示 Web 内容是否可以以编程方式显示键盘 // 当此属性设置为`true`时,用户必须显式点击 Web 视图中的元素以显示该元素的键盘(或其他相关输入视图)。当设置为 时`false`,元素上的焦点事件会导致输入视图自动显示并与该元素关联。 keyboardDisplayRequiresUserAction = false;
WKWebView
-
WKWebView 需要通过 runtime 取处理,具体操作: @郭家秀才-WKWebView支持代码focus唤起键盘
下面是webkit开发成员,针对 网友提问 的回复截图(大意就是说:在没有用户操作行为的情况下,自动聚焦唤起键盘的行为 对用户是不友好的,这可能导致用户不再使用app,所以他们就 没支持autofocus):