问题是:在我们的付款页面上,我们有各种表单字段(输入和选择)。出于PCI/安全目的,我们有一个iframe来提供信用卡号字段(该iframe仅有该字段-没有其他内容)。
对于仅iOS用户,问题在于他们有时无法将焦点放在信用卡号字段上。看起来有两个不同但相关的iOS WebKit错误。如果他们只是从一个字段导航到另一个字段,通常可以解决问题。但是如果他们在字段之间反弹,他们会陷入一种情况,尽管他们会尝试,但似乎无法将焦点放在信用卡号字段上(似乎是呈现问题)。
最初,我们认为可能是JS或某些不可见DIV挡住了路,但我最终能够创建一个仅HTML示例以重现问题。(如何重现该问题的说明在示例页面上。)链接到codepen需要我包含一些代码:
<iframe src="iframe.html"></iframe>
我一直能够在iOS 10-12设备上重现此问题(iOS 9设备似乎没有这个问题)。
为了记录,我将提供一个与WebKit bug有关但是半相关的解决方法。然而,我想知道是否有其他人遇到过这个问题并发现了其他解决方法。
更新:
经过进一步的挖掘,我发现我们遭受了两个不同的错误。第一个错误大多如我上面所描述的,但似乎更像是iOS没有将焦点放在字段上的呈现问题。然而,如果您转到新示例我设置的地方并按照步骤操作,即使看起来该字段没有焦点,如果您键入文本,它也会正确呈现。
第二个问题不太可能发生,但更为严重。它需要满足三个条件:
- iframe的源必须是跨域的
- 父页面正在附加一个事件侦听器以touchstart、touchmove或touchend(甚至只是一个空函数调用)
- 当不同的字段具有焦点并且键盘存在时,iframe的字段不在屏幕上。
如果更改了这三个条件中的任何一个(非跨域,这三个触摸事件上没有事件侦听器或者iframe可见),则只存在第一个-限制较少的-错误。
我也会根据这个认识更新下面的“答案”。
更新2:我提供的新示例展示了这两个错误;第一个页面是Bug#1,链接到跨源Bug#2示例。
document.addEventListener('touchstart', {});
,我的环境中的问题已经解决。 - GlennG