Javascript Android浏览器:触发touchcancel,尽管touchmove具有默认设置

Javascript Android浏览器:触发touchcancel,尽管touchmove具有默认设置,javascript,android,jquery,webkit,touch,Javascript,Android,Jquery,Webkit,Touch,我正在尝试构建一个网页,它可以感知用户的触摸,并沿画布拖动对象 所以我在做这样的事情: var touchStart = function(e) { e.preventDefault(); // Do stuff } var touchMove = function(e) { e.preventDefault(); console.log("Touch move"); // Move objs } var touchEnd = function(e) {

我正在尝试构建一个网页,它可以感知用户的触摸,并沿画布拖动对象

所以我在做这样的事情:

var touchStart = function(e) {
    e.preventDefault();
    // Do stuff
}
var touchMove = function(e) {
    e.preventDefault();
    console.log("Touch move");
    // Move objs
}
var touchEnd = function(e) {
    e.preventDefault();
    console.log("Touch start!");
    // clean up stuff
}
var touchCancel = function(e) {
    e.preventDefault();

    // Oh NO touch cancel!
    console.log("Touch cancel!");

}
bindElemOrig.addEventListener('touchstart', touchStart, false);
bindElemOrig.addEventListener('touchmove', touchStart, false);
bindElemOrig.addEventListener('touchend', touchStart, false);
bindElemOrig.addEventListener('touchcancel', touchStart, false);
在某种程度上,它可以正常工作

问题是,一旦我加载了太多OBJ,我觉得touchmove的响应时间太长,就会触发touchcancel。问题是,一旦触发了touchcancel,我就不会再收到任何touchmoves事件,我再也感觉不到移动了

有人面对过这个问题吗?我知道Android中有一个bug,你必须调用preventDefault(),但在这种情况下,由于内存负担,它似乎无法工作


谢谢大家!

这个问题可能是由于Chrome/Android中的一个bug(功能?)造成的。看

此测试演示了以下行为():


无功延迟=200;
var haltEvent=函数(事件){
event.preventDefault();
event.stopPropagation();
};
var pause=函数(){
var startTime=new Date().getTime();
while(new Date().getTime()[]

我没有发现touchcancel事件是随机触发的。相反,只要从touchmove事件处理程序返回大约200毫秒,就会触发它。

如下所示

var touchMove = function(e) {
    e.preventDefault();
    setTimeout(function(){
        console.log("Touch move");
    // Move objs

    })
}
使用setTimeout将您的逻辑封装在touchmove中可以解决此问题。

专门设计用于控制触摸事件,并在非常小的触摸和移动操作(接近20px,取决于浏览器)后执行常规浏览器操作,如平移或缩放

您唯一的选择是:

  • 切换到指针事件,并使用
    触摸操作
    CSS属性 防止触发
    pointercancel
    (推荐,但需要安卓5+)
  • touchmove
    事件处理程序中添加
    event.preventDefault()
    ,但这也将禁用任何默认操作,如滚动、平移、缩放等

  • 您不能在
    触摸取消
    函数中尝试取消或
    preventDefault();浏览器已停止侦听
    touchmove
    事件。这是出于设计,不是bug。

    我在Android 2.3上遇到了同样的问题。安卓4+似乎还可以。你在这个话题上找到什么了吗?@dioslaska shim@为了将来的参考,这里的答案非常有效:
    var touchMove = function(e) {
        e.preventDefault();
        setTimeout(function(){
            console.log("Touch move");
        // Move objs
    
        })
    }