在 Android 浏览器中禁用触摸取消触发

Posted

技术标签:

【中文标题】在 Android 浏览器中禁用触摸取消触发【英文标题】:Disable the firing of touchcancel in Android Browser 【发布时间】:2013-06-20 10:40:23 【问题描述】:

我正在制作一个使用 javascript 触摸事件的移动网站。在 ios Safari 和 android 版 Chrome 中一切正常,但现有的 Android 浏览器(4.1.2 版)给我带来了麻烦。

在触摸过程中,touchstarttouchmove 事件按预期调用。但是,touchmove 处理程序执行的操作之一似乎触发了过早的touchcancel 事件。 (我不确定这是否重要,但触发touchcancel 的动作是修改SVG 对象的viewBox 属性。)如果我注释掉这个动作,触摸过程会正常进行(即完成touchmovetouchend)。

我所有的触摸处理程序都调用了preventDefault() 函数,所以问题不是这个错误中描述的问题:https://code.google.com/p/android/issues/detail?id=19827。

我读到有很多关于何时调用touchcancel 的inconsistency among browsers。库存的 Android 浏览器是唯一对我有问题的浏览器。

那里有解决方法吗?例如,我可以完全禁用touchcancel 事件吗?我的另一个想法是让touchcancel 处理程序以编程方式触发另一个touchstart/touchmove 事件,但我并没有走得太远。任何想法将不胜感激。

【问题讨论】:

啊!我认为这个问题现在已经迁移到 Chrome 浏览器了!它出现在第 28 版中。请参阅 code.google.com/p/chromium/issues/detail?id=260732。 另见这篇文章,似乎相关:***.com/questions/15944197/… 我现在在 Chrome 浏览器中遇到了这个问题,干扰了 Hammer.js 的使用。有谁知道如何解决这个问题? 在这里投诉code.google.com/p/chromium/issues/detail?id=372357 供将来参考,这里的答案完美无缺:***.com/questions/10367854/html5-android-touchcancel 【参考方案1】:

我知道这有点晚了,但如果其他人面临这个问题,here's a small jQuery extension 解释了如何处理pointercanceltouchcancel 事件。

基本上,如果您切换到指针事件,您只需使用值为nonetouch-action CSS 属性即可阻止pointercancel,只要浏览器具有这两个功能都正确实现。 (Android 5+、Chrome 55+、IE11、Edge 等)

如果您确实必须使用旧的 touch 事件,则必须在 touchmove 事件中实现 event.preventDefault(),这将阻止 touchcancel 触发,但它也会完全禁用浏览器对任何默认操作(如平移或单击)的处理。

最后一点,我不会使用 触摸事件 + 触摸动作 CSS 规则,因为 touch-action 是最近才添加的,与指针事件相同。因此,虽然这种组合可能在较新的浏览器中工作,但它肯定会在较旧的浏览器中失败(通过意外触发touchcancel 事件)。

查看我发布的 jQuery 扩展中的 README,因为它解释了使用 TouchEvent 和 PointerEvent 接口的含义。

【讨论】:

【参考方案2】:

如果您使用的是hammer.js,您可以禁用指针事件(这会导致此类问题),方法是添加: delete window.PointerEvent; 在加载hammer.js之前在您的index.html中,它将忽略这些事件。 您还可以设置 SUPPORT_POINTER_EVENTS = false; (v2.0.8 的第 384 行)做同样的事情。 理想情况下,开发人员会添加关闭此功能的功能,但开源困境也是如此......

【讨论】:

太棒了!谢谢!几天以来,我一直在与 Chrome (Android) touchcancel 行为作斗争,这是第一个真正解决了我的hammer.js 问题的解决方案。 你在开玩笑吧!?我不敢相信这行得通。多么疯狂!我花了三天时间尝试解决为什么我的 UI 出现问题,而这个简单的 k̶l̶u̶d̶g̶e̶ 修复解决了它?哇……只是……哇……【参考方案3】:

我认为 touchcansel 是在用户以特定行为触摸按钮时触发的特殊事件。

例如。用户触摸按钮,但他的手指并没有完全从该按钮的显示屏上移开,而是可以将其向左移动一点,然后在那里结束他的动作。在这种情况下,会出现 touchcancel。

因此,如果您不希望触发该操作,我认为您必须在 android 浏览器中删除与该操作相关的所有处理程序。

$('selector').off('touchcancel'),如果它被删除 $('parent').undelegate('touchcancel','selector')

我认为 e.preventDefault() 没有问题。只有当您单击链接并且页面开始重新加载时才可能出现。单击按钮时可能会重新加载页面?并且您在页面重新加载后等待一些操作,您实际上可能不明白它发生了。

【讨论】:

Touchcancel 将不可避免地被浏览器触发,并且尝试取消或阻止其中的默认值将无法按预期工作。

以上是关于在 Android 浏览器中禁用触摸取消触发的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 上禁用标注(上下文菜单)

手机网页中,长按会触发系统事件,请问怎么取消这些事件

jQuery 没有在隐私浏览中触发点击/触摸启动事件

vue ---- 实现手机端(左滑 删除。右划 正常)

Android攻城狮Gallery和ImageSwitcher制作图片浏览器

Android:WebView 触摸事件监听器