【问题标题】:How to preventDefault for event A from event B handler如何从事件 B 处理程序中防止事件 A 的默认值
【发布时间】:2014-07-09 17:55:36
【问题描述】:

我有一个附加到 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 事件处理程序。

我在这里做错了什么?

【问题讨论】:

  • 试试event.stopPropagation()
  • 谢谢,但没用。
  • touchmove 事件处理程序触发时,touchStartEvent 不能再被阻止 - 它已经发生了。
  • @Bergi 我明白了。这解释了很多。但是浏览器如何确定事件何时结束?直到下一个事件触发?
  • 是的,当所有处理程序都执行完毕后,就会执行默认操作(然后可以处理队列中的下一个事件)。阅读w3.org/TR/DOM-Level-3-Events/#dom-event-architecture

标签: javascript


【解决方案1】:

当您调用 preventDefault 时,它适用于 touchstart 事件,而不适用于 click 事件。

您可以为链接对象添加一些属性来指示移动状态,并在点击处理程序本身中检查它(并通过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);
});

【讨论】:

  • 谢谢,我想在点击处理程序中不使用布尔变量。我知道我总是可以这样做,但我不想这样做。顺便说一句,stopImmediatePropagation 只停止同一事件,而不是所有事件。见developer.mozilla.org/en-US/docs/Web/API/…
  • 是的,关于 immediatePropagation 你是对的,所以它不是一个选项。如果您不想使用布尔变量,我看到的唯一其他选项是在 touchmove 期间删除点击侦听器(与删除 touchmove 本身相同),然后在 touchstart 或 touchend 上重新添加它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 2011-12-12
相关资源
最近更新 更多