2016-03-22 8 views
3

Wenn das Ereignis eintritt, wird ein anderes Ereignis durch seinen Namen ausgelöst. In einigen Fällen kann der zweite Handler preventDefault anrufen. Wie übergebe ich diesen Anruf an das ursprüngliche Ereignis?Wie preventDefault Anruf an ein anderes Ereignis übergeben?

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.

Antwort

1

Sie können ein Array von Argumenten zu trigger() geben, die an den Ereignis-Handler in on() eingestellt übergeben wird. Hier ist, wie Sie es tun:

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

Sie können mehr über trigger()here erfahren.

UPDATE:

Wenn Sie nicht wollen, die Handler bearbeiten ist der Weg zu gehen:

$("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() Gibt zurück, ob Event.preventDefault() wurde jemals auf diesem Event-Objekt aufgerufen.

+0

Ich möchte keine Handler des zweiten Ereignisses ändern. – Qwertiy

+0

Wenn ich den Handler ändere, werde ich nur das ursprüngliche Ereignis an ihn übergeben. Warum brauche ich einen Rückruf? – Qwertiy

+0

@Qwertiy Siehe meine aktualisierte Antwort –

Verwandte Themen