2016-03-22 24 views
3

當事件發生時,一些其他事件由其名稱觸發。在某些情況下,第二個處理程序可以撥打preventDefault。如何將此電話轉接至原始活動?如何將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

你可以傳遞參數給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

UPDATE:

如果你不想要編輯的處理,這是要走的路:

$("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()曾經被稱爲該事件的對象。

+0

我不想修改第二個事件的處理程序。 – Qwertiy

+0

如果我修改處理程序,我只是將原始事件傳遞給它。爲什麼我需要回撥? – Qwertiy

+0

@Qwertiy查看我的更新回答 –

相關問題