我们正在模拟滚动无限列表,我们希望检测单个手指滚动或用户开始手势之间的差异。
理论上,人们可以在IE10中将每个MSPointerDown
的手指数减少+1,MSPointerUp
事件减少-1(和/或使用event.msPointerId匹配手指)。
实际上,至少有一个错误,其中IE10将生成MSPointerDown事件但从未发送匹配的MSPointerUp事件。 (抱歉,我无法创建一个简单的测试用例来展示这一点,但我确实花了很多时间检查MSPointerUp事件肯定缺失。可能是因为删除了子元素在触摸期间)。
也许使用MSGesture事件来查看多个手指是否已关闭? (我试过这个但收效甚微,但也许其他人已经解决了这个问题。)
有什么想法吗?
PS:在webkit中,相当于检查touchstart事件中的event.touches.length === 1
(请注意,您需要一个不明显的技巧才能使其工作:document.ontouchstart必须注册一个事件,然后是event.touches.length对于其他元素上注册的touchstart事件,将是正确的。
答案 0 :(得分:2)
确保您还跟踪MSPointerOut。我发现如果你在可跟踪区域之外放开屏幕,将不会调用MSPointerUp。
如果有帮助,我有一个WinJS课程,我一直用它来跟踪多点触控状态。
var TouchState = WinJS.Class.define(
function () {
this.pointers = [];
this.primaryPointerId = 0;
this.touchzones = [];
}, {
touchHandler: function (eventType, e) {
if (eventType == "MSPointerDown") {
if (!this.pointers[this.primaryPointerId] || !this.pointers[this.primaryPointerId].touching) {
this.primaryPointerId = e.pointerId;
}
e.target.msSetPointerCapture(e.pointerId);
this.pointers[e.pointerId] = {
touching: true,
coords: {
x: e.currentPoint.rawPosition.x,
y: e.currentPoint.rawPosition.y
}
};
this.checkTouchZones(this.pointers[e.pointerId].coords.x, this.pointers[e.pointerId].coords.y, e);
}
else if (eventType == "MSPointerMove") {
if (this.pointers[e.pointerId]) {
this.pointers[e.pointerId].coords.x = e.currentPoint.rawPosition.x;
this.pointers[e.pointerId].coords.y = e.currentPoint.rawPosition.y;
}
}
else if (eventType == "MSPointerUp") {
if (this.pointers[e.pointerId]) {
this.pointers[e.pointerId].touching = false;
this.pointers[e.pointerId].coords.x = e.currentPoint.rawPosition.x;
this.pointers[e.pointerId].coords.y = e.currentPoint.rawPosition.y;
}
}
else if (eventType == "MSPointerOut") {
if (this.pointers[e.pointerId]) {
this.pointers[e.pointerId].touching = false;
this.pointers[e.pointerId].coords.x = e.currentPoint.rawPosition.x;
this.pointers[e.pointerId].coords.y = e.currentPoint.rawPosition.y;
}
}
},
checkTouchZones: function (x, y, e) {
for (var zoneIndex in this.touchzones) {
var zone = this.touchzones[zoneIndex];
if (x >= zone.hitzone.x1 && x < zone.hitzone.x2 && y > zone.hitzone.y1 && y < zone.hitzone.y2) {
zone.callback(e);
}
}
},
addTouchZone: function (id, hitzone, callback) {
this.touchzones[id] = {
hitzone: hitzone,
callback: callback
};
},
removeTouchZone: function (id) {
this.touchzones[id] = null;
}
});