【问题标题】:Click Delay On IPhone and Suppressing Input Focus单击 iPhone 上的延迟并抑制输入焦点
【发布时间】:2011-06-19 06:07:43
【问题描述】:

iphone 上的 webkit 浏览器在用户进行触摸和 javascript 获得点击事件之间有 300 毫秒的延迟。发生这种情况是因为浏览器需要检查用户是否进行了双击。我的应用程序不允许缩放,所以双击对我来说毫无用处。许多人对此问题有proposed solutions,他们通常涉及处理触摸结束事件上的“点击”,然后忽略浏览器生成的点击。但是,似乎无法抑制发送到输入元素的点击。如果您有一个在表单上方打开的对话框,然后用户点击关闭按钮并且当表单消失时他们的点击被路由到输入元素,这可能会导致问题。

Example with jqtouch(仅适用于 iPhone)

【问题讨论】:

    标签: javascript iphone html webkit jqtouch


    【解决方案1】:

    如果您想获得尽可能快的响应,您必须在 touchstart 上捕获您的事件。否则你将注定要受到这种输入滞后的影响。

    您必须记住,虽然在 touchstart 上捕获事件并对其做出响应,但无法通过将手指拖出响应区域来取消操作。

    我个人在基于 PhoneGap html/js 的 iphone 应用程序中使用了它,它运行良好。提供这种近乎原生的感觉的唯一解决方案。

    现在关于您的问题 - 您是否尝试过阻止事件的传播?它应该可以解决您的问题。

    $('.button').bind('touchstart', function(e){
        e.stopPropagation();
        // do something...
    });
    

    希望对你有帮助,

    汤姆

    【讨论】:

    • 如果您在 touchstart 上停止该事件,我认为您会中断滚动。虽然这可能是最好的解决方案
    • 你可以停止在 touchend 上的传播,然后在 touchstart 上做任何你需要做的事情——据我所知,输入关注的是 touchend 而不是 touchstart,所以它应该可以解决问题。
    【解决方案2】:

    我和我的同事开发了一个名为 FastClick 的开源库,用于消除 Mobile Safari 中的点击延迟。它将触摸转换为点击,并干净地处理 inputselect 元素的特殊情况。

    就像在 body 上实例化它一样简单:new FastClick(document.body),然后像往常一样监听点击事件。

    【讨论】:

    • 嗨!喜欢你的 FastClick 脚本!才发现。但是我遇到了输入问题:当我专注于输入时,iPad 的键盘弹起并立即再次隐藏...知道为什么吗?
    • 它在什么浏览器、设备、操作系统和版本上运行?
    • 您好,感谢您的关注。是iOS5下的iPad(第一版)
    • 正如您在 github 页面上所讨论的,这个插件有很多错误,并且不能很好地用于输入字段等
    • @Jonathan 帮帮忙怎么样?
    【解决方案3】:

    我把 Matt 的 FastClick 做成了一个 jquery 插件:

    stackoverflow link

    刚刚对 onClick 处理程序的调用发表了评论,而没有传递必要的范围。我更新了代码以使其工作。 当输入元素位于幽灵事件的位置下方时,似乎还有一个问题:焦点事件被触发而没有被破坏。

    【讨论】:

      【解决方案4】:

      我发现这个问题有两个问题。一个是处理点击延迟,另一个是处理输入焦点。 是的,这两者都必须在移动网络中妥善处理。

      1. 点击延迟有更深层次的原因。这篇文章很好地解释了这个 300ms 延迟的原因。 Responsiveness of the click event.

        谢天谢地,这个问题已被许多图书馆所熟知并解决。 JQTouch, JQuery Mobile, JQuery.tappable, Mootools-mobile, 和tappable

        这些库中的大多数都会创建一个名为 tap 的新事件。您可以使用类似于点击事件的点击事件。这种 jquery-mobile 事件处理可能会有所帮助。

         $("#tappableElement").tap(function(){
           // provide your implementation here. this is executed immediately without the 300ms delay.
         });
        
      2. 现在,第二个问题是输入焦点的处理。 这里也有明显的延迟。 这可以通过针对 touchstart 或 touchend 事件之一立即强制关注元素来解决。这种 JQuery 事件处理可能会有所帮助。

        $('#focusElement').bind('touchstart', function(e){
            $(this).focus();
        });
        
        $('#focusElement').focus(function(e){
            // do your work here.
        });
        

        您可以在“touchstart”事件处理中执行 e.stopPropagation 以避免传播。但我强烈建议不要返回 false;或 e.preventDefault 因为这将停止复制/粘贴、选择文本等默认功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-14
        • 2021-10-27
        • 2017-03-10
        • 1970-01-01
        相关资源
        最近更新 更多