此问题可能是由于Chrome/Android中的错误(功能?)引起的。见this bug report。
这个测试证明的行为(JSFiddle):
var delay = 200;
var haltEvent = function(event) {
event.preventDefault();
event.stopPropagation();
};
var pause = function() {
var startTime = new Date().getTime();
while (new Date().getTime() < startTime + delay);
};
window.addEventListener('load', function() {
var target = document.querySelector('#target');
var status = document.querySelector('#status');
target.addEventListener('touchstart', function(event) {
haltEvent(event);
status.innerHTML = '[touchstart]';
}, true);
target.addEventListener('touchmove', function(event) {
pause();
haltEvent(event);
status.innerHTML = '[touchmove]';
}, true);
target.addEventListener('touchend', function(event) {
status.innerHTML = '[touchend]';
}, true);
target.addEventListener('touchcancel', function(event) {
status.innerHTML = '[touchcancel]';
}, true);
});
#target {
background-color: green;
height: 300px;
}
#status {
text-align: center;
}
[]
我没有找到touchcancel事件是随机发射。相反,只要从touchmove事件处理程序返回大约200毫秒时就会触发它。