我们发现,在最近升级到Google Chrome(版本55+)时,引入了指针事件“使用新的标准统一了这两种模型:指针事件。”,我们需要修改事件处理方式以实现向后兼容。我们的应用程序是专门为Chrome编写的。
今天早上,我们一直在实验,试图确定触发了哪个事件(基于Chrome版本),以便为我们应用程序的所有用户适当地处理该事件。作为测试,我编写了以下内容:
在非移动设备上,
我原本期望
今天早上,我们一直在实验,试图确定触发了哪个事件(基于Chrome版本),以便为我们应用程序的所有用户适当地处理该事件。作为测试,我编写了以下内容:
$(document).on('mousedown touchstart pointerdown', '.foo', function(event){
console.log( event.type + ": " + event.which );
switch(event.type) {
case 'mousedown':
console.log('moused!');
break;
case 'touchstart':
console.log('touched!');
break;
case 'pointerdown':
console.log('pointed');
break;
};
})
在非移动设备上,
mousedown
和pointerdown
都被注册。在移动设备上,所有三个事件都会被输出到控制台。
澄清:需要的是一旦遇到并处理第一个事件,就不再触发任何其他事件。换句话说,如果例如触发了pointerdown
,则需要防止触发mousedown
和touchstart
。后续的点击也应该正常工作,所以如果我得到一个pointerdown
并再次点击,则应该得到另一个pointerdown
(或适用于浏览器版本或设备的其他事件)。我原本期望
break;
会导致jQuery离开switch()
,但事实并非如此。因此,我在每个case中添加了.clearQueue()
:$(this).clearQueue();
再一次,我期望事件会被遇到和处理,队列会被清除,我就不会有其他事件触发了。
但我错了。
我开始感觉自己似乎漏掉了一些显而易见的东西,但我无法确定是什么。我已经尝试过 .stop()
,.finish()
以及这些函数的组合,以便拦截所需的一个函数(基于浏览器版本)并清除队列,以便其余部分不会触发。
我认为我对JavaScript事件队列非常了解,但显然我也错了。
我是否漏掉了一些显而易见的东西?如果是这样,它是什么?
queue()
时,您正在注册自己的回调函数,但对于事件注册.on(....)
,不使用.queue()
。 - Scott Marcus.clearQueue()
没有起作用。 - Jay Blanchardpointerdown
仍然会触发。 - Jay Blanchard