Javascript 多次触碰:仅当触碰移动发生时触发触碰结束事件
我想在我的javascript应用程序从ios设备(或者android以后)访问时添加一些多点触控功能 我想提供一个类似shiftkey的功能:用户可以用一个手指按住屏幕上的按钮,当按下此按钮时,屏幕其余部分的点击行为与传统的点击行为略有不同 我遇到的问题是,我没有收到轻敲手指的任何touchend事件,除非按住Shift键的第一个手指触发了touchmove 由于屏幕非常敏感,touchmove事件很容易触发,在大多数情况下一切正常 但是,当用户的手指有点太静止时,在用户稍微移动手指之前,不会检测到敲击。 这会在轻敲和屏幕上发生的动作之间产生可变的“延迟”(如果用户非常平静,延迟可能会变化并持续几秒钟)。 我的猜测是,这个延迟将导致用户再次点击,从而触发第二次操作,这是我不想要的 您可以在此处使用ipad/iphone进行测试: 试着让身体保持绿色几秒钟,保持手指静止在青色div上,同时轻敲红色div 这种行为是意料之中的吗? 是否有一些已知的解决问题的方法? 我本以为当手指从屏幕上取下时,touchend事件会立即触发 我用iOS 5.1.1(ipad1和iphone4s)对此进行了测试Javascript 多次触碰:仅当触碰移动发生时触发触碰结束事件,javascript,ios,safari,multi-touch,touchmove,Javascript,Ios,Safari,Multi Touch,Touchmove,我想在我的javascript应用程序从ios设备(或者android以后)访问时添加一些多点触控功能 我想提供一个类似shiftkey的功能:用户可以用一个手指按住屏幕上的按钮,当按下此按钮时,屏幕其余部分的点击行为与传统的点击行为略有不同 我遇到的问题是,我没有收到轻敲手指的任何touchend事件,除非按住Shift键的第一个手指触发了touchmove 由于屏幕非常敏感,touchmove事件很容易触发,在大多数情况下一切正常 但是,当用户的手指有点太静止时,在用户稍微移动手指之前,不会
编辑:发现了一个类似的问题好的,我已经实现了这个解决方案,它看起来很有效
//Initialize the tap touch
function ManageTapTouch() {
this.__enabled__ = false;
}
ManageTapTouch.prototype.init = function(){
$("#hold").bind('touchstart', $.proxy(this.__enable__, this));
$('#hold').bind('touchend', $.proxy(this.__disable__, this));
$('#tap').bind('touchstart', $.proxy(this.__changeColorOnHold__, this));
$('#tap').bind('touchend', $.proxy(this.__changeColorOnOut__, this));
};
ManageTapTouch.prototype.__enable__ = function(event) {
this.__enabled__ = true;
};
ManageTapTouch.prototype.__disable__ = function(event) {
this.__enabled__ = false;
$('body').css('background-color', 'blue');
};
ManageTapTouch.prototype.__changeColorOnHold__ = function(event) {
if (this.__enabled__){
$('body').css('background-color', 'black');
}
};
ManageTapTouch.prototype.__changeColorOnOut__ = function(event) {
$('body').css('background-color', 'blue');
};
new ManageTapTouch().init();
您可以在此处看到它正在运行:
您还可以在iPhone上尝试另一种使用多点触摸的方式:
event.originalEvent.touchs[0].pageX
和event.originalEvent.touchs[0].pageY
其中食指是屏幕上的手指,事件是在touchtstart
上触发的事件。有了这些主题,您可以实现自己版本的此操作,也可以使用我在这里提出的操作。因此,您似乎已经达到了无法避免的场景之一,并且只会出现bug攻击。您正在创建一个UI功能,它还不是“标准”,但似乎有一些希望(我喜欢…我喜欢)。在技术发展的这一点上,你要问自己的问题是“我怎样才能强迫用户滑动手指来按住shift键?”
在一个好的设计师的帮助下,我认为你可以创建一个滑动切换按钮类似于。。。用户必须按住此按钮才能打开开关。松开后,开关将弹回“关闭”位置。我提到设计师是因为按钮需要看起来像它的行为。也许有些评论会有创意 好吧,这真让人头疼。是的,有两个已知的问题。首先,Safari有时并不介意触发touchEnd事件,除非某个地方有touchMove,即使touchMove实际上没有什么作用 其次,Chrome Mobile也是一种可爱的体验,在许多Android设备上,无论你做什么,touchEnd事件都不会触发。根据我的经验:
- 实施一个touchStart事件,该事件记录开始坐标等
- Implmenet一个touchMove事件,它与touchEnd执行完全相同的操作,但确保回调不会触发多次。使用在更高范围内定义的布尔标志或类似的内容
- 使用在更高范围内定义的相同布尔标志,实现正常的touchEnd事件,该事件仅在touchMove尚未触发回调时才会触发