Christophe Coenraets 在其用于 PhoneGap 应用程序的 10 大性能技术中解决了这个问题。这是第 6 期,视频可在Adobe TV上观看(第 31 分钟)。
基本上,300ms 延迟不是错误或性能问题,它是检测可能的双击所必需的功能。
摆脱这种延迟的解决方案是使用事件的组合,touch
而不是click
像这样的事件:
var trackingClick = false;
var targetElement = null;
var touchStartX = 0;
var touchStartY = 0;
var touchBoundary = 10;
target.addEventListener('touchstart', function(event) {
trackingClick = true;
targetElement = event.target;
touchStartX = event.targetTouches[0].pageX;
touchStartY = event.targetTouches[0].pageY;
return true;
});
target.addEventListener('touchend', function(event) {
trackingClick = false;
//handle click event
...
return false;
});
target.addEventListener('touchmove', function(event) {
if (!trackingClick) {
return true;
}
// If the touch has moved, cancel the click tracking
if (targetElement !== event.target
|| (Math.abs(event.changedTouches[0].pageX - touchStartX) > touchBoundary
|| (Math.abs(event.changedTouches[0].pageY - touchStartY) > touchBoundary)) {
trackingClick = false;
targetElement = null;
}
return true;
});
target.addEventListener('touchcancel', function() {
trackingClick = false;
targetElement = null;
});
但这基本上就是FastClick正在做的事情(事实上,上面的代码片段只是一个从fastclick 源代码中提取的非常基本的示例)。还有很多其他情况需要处理,所以如果你不想实现自己的库,你应该仔细看看 FastClick。它不仅适用于jQuery 移动用户,实际上它甚至不需要 jQuery,它只是一个自包含的小型库。
jQuery 移动用户注意事项:您可以使用 FastClick,但您应该注意内置的类似功能:vclick
tl;dr:如果你没有 jQuery Mobile,请使用FastClick