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

时间:2016-03-22 18:12:17

标签: javascript jquery javascript-events

当事件发生时,其名称会触发其他一些事件。在某些情况下,第二个处理程序可以调用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>
&#13;
&#13;
&#13;

PS:Same question in Russian.

1 个答案:

答案 0 :(得分: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() here的更多信息。

<强>更新

如果你不想编辑处理程序,这是要走的路:

$("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()。