单击两次后无法在 iOS 上输入 html 输入字段

Posted

技术标签:

【中文标题】单击两次后无法在 iOS 上输入 html 输入字段【英文标题】:Can't type into html input fields on iOS after clicking twice 【发布时间】:2012-10-29 15:10:04 【问题描述】:

我在 ios 上遇到了一个问题,我已经解决了这个问题:

http://jsfiddle.net/Hk56Q/

如果为任何触摸事件(touchstart/touchmove/touchend)在文档中添加了事件监听器,如下所示:

function onTouch( e );
document.addEventListener( 'touchstart', onTouch, false );

这导致输入字段在 iOS 上具有以下行为:

第一次触摸:输入获得焦点,用户可以正确输入 随后的触摸(焦点在已经存在的字段上):打字不再起作用

我正在 iOS 5、5.1 和 6 以及 iPad 和 iPhone(模拟器和实际设备)上遇到并测试此问题。

唯一的解决方法似乎是删除事件侦听器以恢复输入字段的正确行为(或者实际上根本不添加侦听器):

document.removeEventListener( 'touchstart', onTouch);

我还注意到,如果页面上有多个 iframe,其中一个将侦听器添加到其文档中,它也会破坏另一个 iframe 的输入字段。

小提琴在我的 android 手机上运行正常。

任何想法为什么会发生这种情况?或者如何在不破坏 iOS 输入的情况下为触摸事件设置全局自定义事件处理程序?

【问题讨论】:

我们在使用 FastClick 时遇到了这个问题,它是 tracked publicly。我还根据您的测试用例向 Apple 提交了bug report。 嘿,是的,这绝对是一个 Safari iOS 错误,报告得很好。我仍然想知道这个问题怎么这么久都没有被注意到.. 我在通过放大/缩小调整 iframe 窗口大小时也遇到了这个错误。 我相信这些问题的根源是相同的,即第一个触摸屏没有手势,当它们可用时,它们覆盖了现有界面,几乎不可能实现自定义手势。两种解决方案是使用手势事件,或者阻止它们并在需要时从头开始重新实现。 看起来很有趣。我现在正在寻找解决此问题的方法。 【参考方案1】:

这里有一个解决方法。设置焦点到窗口,然后回到节点,超时:

function fixIpadTouch(node)
    node.ontouchend=function(e)
        if(document.activeElement===node)
            window.focus();
            setTimeout(function()
                node.focus();
            ,0);
        
    

【讨论】:

我不敢相信这没有更多的赞成票。解决这个问题的唯一有效解决方案。你是一个救生员:-) 对不起,我是新人,这个功能怎么用,你能帮我详细介绍一下吗?非常感谢!【参考方案2】:

在我的情况下,特里的答案变体解决了这个 Mobile Safari 错误 (!!!)。在这里,'#input' 和这段代码在 iframe 页面上:

var el = $('#input');
el.on('keydown', function() 
  window.focus()
  el.focus()
);

错误以多种方式触发,但“keydown”可靠地通过。这也使得下一个“按键”到达。

【讨论】:

【参考方案3】:

jQuery Mobile 1.2.0 应该是你所需要的

证明!勾选前:

勾选后:

【讨论】:

以上是关于单击两次后无法在 iOS 上输入 html 输入字段的主要内容,如果未能解决你的问题,请参考以下文章

单击两次后jQuery动画不起作用

ios上有时候提交按钮点击两次才可以取消输入框软键盘

当我在显示的键盘上单击文本字段两次时,iOS UIScrollView 无法滚动

为啥我需要单击两次才能在输入字段中生成一个值

jQuery $.post() 执行两次后的 php 代码

播放两次后动态声音不播放