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

时间:2012-10-29 15:10:04

标签: javascript ios events input touch

我在iOS上遇到问题,而且我已经为它做了一个小提琴:

http://jsfiddle.net/Hk56Q/

如果事件监听器被添加到文档中以用于任何触摸事件(touchstart / touchmove / touchend),请执行以下操作:

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

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

  • 首先触摸:输入获得焦点,用户可以正确输入
  • 后续接触(重点关注已经到位的字段):打字不再工作

我在iPad和iPhone(模拟器和实际设备)上在iOS 5,5.1和6上体验并测试了这个问题。

唯一的修复似乎是删除事件监听器以恢复输入字段的正确行为(或实际上从不添加监听器):

document.removeEventListener( 'touchstart', onTouch);

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

小提琴在我的Android手机上表现正常。

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

3 个答案:

答案 0 :(得分:14)

这是一个解决方法。将焦点设置到窗口,然后在超时时间内返回节点:

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

答案 1 :(得分:2)

在我的案例中,Terry的一个变体解决了这个Mobile Safari错误(!!!)。在这里,'#input'和此代码位于iframe页面上:

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

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

答案 2 :(得分:0)

jQuery Mobile 1.2.0应该是您所需要的

PROVE!在打勾之前:

PROVE(before)

勾选方框后:

After ticking