如何判断只有一个手指触摸Microsoft IE10

时间:2013-02-08 03:05:16

标签: javascript touch internet-explorer-10

我们正在模拟滚动无限列表,我们希望检测单个手指滚动或用户开始手势之间的差异。

理论上,人们可以在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事件,将是正确的。

1 个答案:

答案 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;
    }
});