如何防止事件B处理程序中的事件A的默认值

时间:2014-05-21 07:55:31

标签: javascript

我有一个附加到touchstart的事件处理程序,我想在touchmove发生时立即调用preventDefault。我目前有这个代码。

link.addEventListener("click", function () {
    console.log("clicked");
});

link.addEventListener("touchstart", function (touchStartEvent) {
    var mouseMoveHandler = function () {
        console.log("moved.");

        touchStartEvent.preventDefault(); // This does not work.
        link.removeEventListener('touchmove', arguments.callee);
    };

    link.addEventListener("touchmove", mouseMoveHandler);
});

http://jsfiddle.net/682VP/

我在touchmove的事件处理程序中为touchstart调用preventDefault。这似乎不起作用,因为始终会调用click事件处理程序。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

当您致电preventDefault时,它适用于touchstart事件,而不适用于点击事件。

您可以为链接对象添加一些指示移动状态的属性,并在单击处理程序本身内部进行检查(并通过preventDefaultreturn false停止

var link = document.getElementById("link");

link.addEventListener("click", function () {
    if (this.moving) {
        this.moving = false;
        return false;
    }
    console.log("clicked");
});

link.addEventListener("touchstart", function (touchStartEvent) {
    var mouseMoveHandler = function () {
        console.log("moved.");
        this.moving = true;
        link.removeEventListener('touchmove', arguments.callee);
    };

    link.addEventListener("touchmove", mouseMoveHandler);
});