如何将preventDefault调用传递给其他事件?

4
当事件发生时,会通过名称触发另一个事件。在某些情况下,第二个处理程序可以调用 `preventDefault`。如何将此调用传递给原始事件? https://jsfiddle.net/edgv8qur/1/

$("button").click(function (event) {
  $("body").trigger("some-custom-event");

  // If the custom event was prevented, prevent original one too
  if (true) { // How to check?
    event.preventDefault();
  }
})

$("body").on("some-custom-event", function (event) {
  if (Math.random() > .5) {
    console.log("prevent");
    event.preventDefault();
  } else {
    console.log("allow");
  }
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<button>Test</button>

PS: Same question in Russian.

1个回答

1
您可以向trigger()传递参数数组,这些参数将传递给在on()中设置的事件处理程序。以下是如何操作:
$("button").click(function (event) {
    function cb(prevent) {
        // If the custom event was prevented, prevent original one too
        if (prevent) {
            event.preventDefault();
        }
    }
    $("body").trigger("some-custom-event", [cb]);
})

$("body").on("some-custom-event", function (event, cb) {
  if (Math.random() > .5) {
    console.log("prevent");
    event.preventDefault();
    cb(true);
  } else {
    console.log("allow");
  }
})

你可以在这里了解更多关于trigger()的信息。 更新: 如果你不想编辑处理程序,那么这是一个可行的方法:
$("button").click(function (event) {
    var event = jQuery.Event('some-custom-event');
    $("body").trigger(event);

    if (event.isDefaultPrevented()) {
        event.preventDefault();
        console.log("Prevented");
    } else {
        console.log("Allowed");
    }
})

$("body").on("some-custom-event", function (event) {
    if (Math.random() > .5) {
        console.log("prevent");
        event.preventDefault();
    } else {
        console.log("allow");
    }
})

event.isDefaultPrevented() 返回一个布尔值,指示是否在此事件对象上调用了 event.preventDefault()。


我不想修改第二个事件的处理程序。 - Qwertiy
如果我修改处理程序,我只需要将原始事件传递给它。我为什么需要回调函数? - Qwertiy
如果我有事件命名空间怎么办? - Qwertiy
是的。我在测试中应该使用jQuery 1.8。在jQuery 1.12中,像.smth这样的调度根本不起作用,甚至不能传递给事件。 - Qwertiy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接