Skip to content

IOS端input自动聚焦问题探究

约 722 字大约 2 分钟

h5适配IOS适配

2024-08-26

1. 背景

在 H5 的开发中,有一个需求是点击了某个元素, 需要将焦点聚焦到其他input元素上, 在实际调用过程中, 发现在安卓端可以实现目标,但是在 IOS 中无法实现目标。

2. 原理

2.1 原因

苹果政策限制,不允许自动 focus;只有用户触发的 focus 事件才会生效。

触屏设备上的 Safari 中 focus()有些限制。苹果触屏设备为表单获焦软键盘弹出设置了个条件:

  1. 屏幕被点击。(事件源: input 、其他元素)
  • 点击 input 调用 focus()或 click()方法使其他 input 获焦
  • 点击其他元素然后在点击事件处理函数中使其他 input 获焦。

2.2 探索场景细分

  1. 触发的元素
  • contenteditable = true
  • contenteditable = false
  1. 目标元素展示时机
  • 已存在
  • 重新渲染 (不同路由、同一路由更新、同一路由不更新)
  1. focus 执行时机
  • 同步
  • 异步

2.3 示例 demo

示例中注释掉的是触发跳转第二个路由的元素。

这是 IOS input聚焦验证页

切换为false

contenteditable = false元素触发(同步)

点我:同一页面

contenteditable = false元素触发(异步)

点我:同一页面

contenteditable = true元素触发(同步)

contenteditable = true元素触发(异步)

聚焦代码演示

3. 最佳实践

触发元素使用 input,异步执行 focus

© 2024 图图 📧 email