(有一些有些有效的解决方案,请参阅列表末尾附近)
在我的公司,我们也深受其害。我们向 Apple 提出了问题,但听到了妈妈的声音。
这里有一些有趣的 jsfiddles 来帮助说明一些问题,它肯定似乎围绕着隐藏字段的数量,而 textareas 似乎没有受到影响。
从调试工作来看,我的猜测是有一些功能试图检测输入是否是信用卡或电话号码或某些似乎导致锁定行为的特殊类型。虽然这只是一个假设..
概括:
在具有包含标记为“显示:无”的容器内的命名输入元素的表单的页面上,第一次按下该表单中的输入在键盘出现和输入被聚焦之间有一个非常明显的延迟(20sec-2min) . 这会阻止用户使用我们的网络应用程序,因为用户界面冻结等待键盘响应所花费的大量时间。我们已经在各种场景中对其进行了调试,以尝试辨别发生了什么,这似乎是由于 iOS7 解析 DOM 的方式与 iOS6 上的方式发生了变化,而 iOS6 没有这些问题。
通过在连接 iPad 的情况下在 Safari 的 Inspector 中进行调试,我们发现 iOS7 提供了有关(程序)活动的更多信息,以至于我们发现 _CollectFormMetaData 是问题的根源。搜索元数据会导致大量流失,随着包含输入的隐藏容器数量的增加,流失率超过线性增长。我们发现 _isVisible 和 _isRenderedFormElement 的调用次数远远超过了它们合理的调用次数。此外,如果有帮助,我们发现一些与信用卡和地址簿相关的检测功能是大量消费者。
这里有一些用于说明的 jsFiddles。请在运行 iOS6 的 iPad 上的 Safari 中查看它们,然后在运行 iOS7 的 iPad 上查看它们:
http://jsfiddle.net/gUDvL/20/ - 两者都运行良好
http://jsfiddle.net/gUDvL/21/ - 在 iOS 7 上只是明显的延迟
http://jsfiddle.net/gUDvL/22/ - iOS 7 上更明显的延迟
http://jsfiddle.net/gUDvL/29/ - iOS 7 上的延迟非常明显
http://jsfiddle.net/gUDvL/30/ - 与 29 相同,但没有隐藏 - 在 iOS 7 上没有延迟
http://jsfiddle.net/gUDvL/38/ - 与 29 相同但进一步恶化
http://jsfiddle.net/gUDvL/39/ - 99 个隐藏输入,一个可见,一个单独可见
http://jsfiddle.net/gUDvL/40/ - 99 个隐藏文本区域,一个可见,一个单独可见
http://jsfiddle.net/gUDvL/41/ - 99 个隐藏输入,一个可见,一个单独可见,都带有 autocomplete="off" 属性
http://jsfiddle.net/gUDvL/42/ - 99 个隐藏输入,一个可见,一个单独可见。由绝对位置和左侧隐藏而不是显示。
http://jsfiddle.net/gUDvL/63/ - 与 gUDvL/43/ 相同,但自动完成、自动更正、自动大写和拼写检查关闭
http://jsfiddle.net/gUDvL/65/ - 与 gUDvL/63/ 相同,但缩进已清理(在 iPad 上似乎较慢)
http://jsfiddle.net/gUDvL/66/ - 与 gUDvL/65/ 相同,但再次通过 css 显示 none 而不是 DOMReady jQuery
http://jsfiddle.net/gUDvL/67/ - 与 gUDvL/66/ 相同,但使用 TedGrav 的焦点/模糊技术
http://jsfiddle.net/gUDvL/68/ - 与 gUDvL/66/ 相同,但使用 css 驱动的文本缩进而不是 display:block 再次(显着改进 - 初始焦点减少到 2-3 秒)
http://jsfiddle.net/gUDvL/69/ - 与 gUDvL/68/ 相同,但重新添加了 TedGrav 的焦点/模糊
http://jsfiddle.net/gUDvL/71/ - 与 gUDvL/66/ 相同,但 js 在每个输入之前添加一个图例标签。(显着改进 - 初始对焦时间减少到 2-3 秒)
<input type="text" autocomplete="off" /> (links to jsfiddle.net must be accompanied by code..)
(我们应该注意到,将 iPad 连接到带有 Safari 调试器的 Mac 会极大地强调延迟。)
重现步骤:
- 在 iPad 上加载上述任何 jsfiddles
- 按下输入以获得焦点
- 观看屏幕,直到您可以输入
预期成绩:
期望能够在键盘弹出时立即输入
实际结果:
观看键盘弹出和屏幕冻结,在一段时间内无法滚动或与 Safari 交互。在持续时间之后,按预期给出焦点。从那时起,在专注于输入时不会再出现冻结。
tl;博士技术总结
因此,总的来说,有几个来自各种答案的建议修复:
- 不要用 display: none 隐藏 div - 使用类似 text-indent 的东西
- 短路 Apple 的元数据扫描逻辑 - 许多表单标签或图例标签似乎都可以解决问题
- 自动对焦/模糊 - 对我不起作用,但有两个人报告说它起作用了
Apple 的相关主题:
https://discussions.apple.com/thread/5468360