Javascript Android浏览器触摸事件停止显示更新,包括画布/元素-如何解决?

Javascript Android浏览器触摸事件停止显示更新,包括画布/元素-如何解决?,javascript,android,android-2.3-gingerbread,Javascript,Android,Android 2.3 Gingerbread,在一些安卓的原生浏览器上,触摸页面似乎会阻止屏幕更新,直到手指松开。对于基于html元素的动画(切换类)和基于画布的动画,都会发生这种情况。但是,它不会停止正常的js执行,其他事件会正常触发。在有此问题的设备上,dolphin浏览器似乎也会受到影响(但不是firefox) Touchstart/move都触发了preventDefault()和StopperOrganization(),cancelBubble=true;e.returnValue=false;。在CSS中,webkit选择也被

在一些安卓的原生浏览器上,触摸页面似乎会阻止屏幕更新,直到手指松开。对于基于html元素的动画(切换类)和基于画布的动画,都会发生这种情况。但是,它不会停止正常的js执行,其他事件会正常触发。在有此问题的设备上,dolphin浏览器似乎也会受到影响(但不是firefox)

Touchstart/move都触发了preventDefault()和StopperOrganization(),cancelBubble=true;e.returnValue=false;。在CSS中,webkit选择也被禁用。页面将不会滚动

这里也提出了类似的问题:

但我想知道这种行为是否可以被克服,或者至少要发现什么设备会受到问题的影响,这是设备还是版本的问题?如果您无法回答问题,请运行演示并报告您的体验以及您的设备型号和useragent(显示在演示页面底部),作为评论,这可能有助于他人或我回答问题

下面是一个演示和重现行为的步骤。链接的二维码可在此处找到

网页顶部有一个画布,底部有一个带有背景图像的div。每隔一秒钟,画布就会被清除,并显示不同的图像,div的类会被切换(两者都在0和1 PNG之间切换)。切换几次后,将手指放在画布(顶部的灰色框)上,并保持在那里。等待查看动画是否继续(有时会持续一次或两次,然后停止),以及是否存在任何视觉扭曲

更新 运行3.2的Galaxy选项卡似乎需要touchstart/end of document的处理程序,而不仅仅是屏幕继续更新显示所需的div。谢谢jimpic


我开始相信这是由制造商的皮肤引起的问题,尽管这很难证明。

我真的无法告诉您为什么会发生这种情况,但我在注册文档触摸事件时遇到了类似的问题。当我只注册touch move事件时,我遇到的问题与您遇到的问题完全相同,但是当我也注册touchstart时,它突然起了作用。在您的示例中,只需将以下行添加到main.js

function touchHandlerDummy(e)
{
    e.preventDefault();
    return false;
}
document.addEventListener("touchstart", touchHandlerDummy, false);
document.addEventListener("touchmove", touchHandlerDummy, false);
document.addEventListener("touchend", touchHandlerDummy, false);
在我的Galaxy选项卡上工作。希望这就是你想要做的。

这样就可以了:)

函数touchHandlerDummy(e) { e、 预防默认值(); 返回false; } 文件。添加的文件列表(“touchmove”,touchHandlerDummy,false);
我也有同样的问题。神奇的是,当我在
部分添加以下行时,问题完全消失了:

<meta name="viewport" content="width=device-width">

这里的答案对我帮助很大

我的解决方案简单地结合了这里提到的内容,因此,如果您愿意:
1。三星Galaxy S2本机浏览器(Android 4.1.2)上的“拖放”
2。禁用用户缩放页面(视口设置为无缩放)


addEventListener(“加载”,函数(){
函数onTouchPreventDefault(事件){event.preventDefault();};
document.addEventListener(“touchmove”,默认值,false);
document.addEventListener(“touchstart”,默认为false);
},假);
  • 视口
    
    

    • 不幸的是,用户仍然可以稍微放大页面,1.01是完成此任务的最小值
  • 禁用按比例缩放
    document.addEventListener(“touchmove”,函数(事件){event.preventDefault();},false);
    

    • 这将禁用“收缩”以进行缩放
  • 禁用双击以缩放
    document.addEventListener(“touchstart”,函数(事件){event.preventDefault();},false);
    //或
    addEventListener(“touchend”,函数(事件){event.preventDefault();},false);
    

    • 这将禁用双击缩放,您可以选择是否要使用touchstart或touchend(或两者兼有)进行此紫色鼠标

  • 我将开始:直到抬起手指,显示才会更新。设备华为Ascert G300:mozilla/5.0(linux;u;android 2.3.6;en gb;u8815 build/huaweiu8815c02b882)applewebkit/533.1(khtml,如gecko)版本/4.0 mobile safari/533.1感谢您的响应,但演示代码已经使用preventDefault并在touchstart和touchmove上返回false。演示页面是否在您的选项卡上工作?您使用的是哪个版本的android(请也使用subversion,即x.y.z)?感谢againI,我知道它已经使用了preventDefault,但只针对选定的元素,而不是完整的文档,也许这就是问题所在。只要在jQuery ready()函数中将上面的行添加到main.js中,它就可以工作了。它在我的Galaxy选项卡上之前不起作用,但是之后-所以试试看:)(Android版本3.2)我复制了你的整个项目,并添加了上面的行。它现在可以工作了。最初在这个演示中,我确实有文档触摸事件的处理程序,但删除了它们以允许复制和粘贴用户代理。这并不能解决我的设备(华为g300)上的问题,但有趣的是,您可以在3.2选项卡上看到这种行为。没有文档touchstart/end的处理程序,它可以在Galaxy Ace 2.3.3和android模拟器2.3.3上运行。我还没有在sim卡上试用过3.2,我会稍后再比较。我开始认为这可能是一个不同的皮肤制造商应用的问题。我会用你的信息更新这个问题,谢谢。你只需要防止触摸屏上的默认设置。这段代码在Android 2.3和Android 4.1上完全禁止任何方向的滚动,为什么会有人使用它?jimpic的回答中已经提出并讨论了这一点。覆盖常规beh时,您还始终需要处理touchstart
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.01">
        <script>
            window.addEventListener("load", function() {
                function onTouchPreventDefault(event) { event.preventDefault(); };
                document.addEventListener("touchmove", onTouchPreventDefault, false);
                document.addEventListener("touchstart", onTouchPreventDefault, false);
            }, false);
        </script>
    </head>