12 Stimmen

jQuery-Ereignisbehandlung abbrechen

Ich habe onclick event handler in der folgenden Weise eingerichtet:

element.onclick = function() { /*code */ }

Stellen Sie sich vor, es gibt Ereignis-Handler, die mit der jQuery-Methode bind() oder ähnlichen Handlern eingerichtet wurden.

$('element').bind('click', function(){/*another function*/})

Wie kann ich verhindern, dass der mit jQuery definierte Handler von dem Handler aufgerufen wird, den ich am Anfang beschrieben habe?

NB stopPropagation() und etc. jQuery-Methoden nicht von dieser Funktion zu arbeiten, weil es mit nativen Ereignis-Objekt übergeben wird.

8voto

James Punkte 106202

Ich bin mir nicht 100%ig sicher, was Sie fragen, aber vielleicht hilft das hier:

Sie können ein neues Event-Objekt (konform mit W3C DOM) über den Event-Konstruktor von jQuery erstellen:

Zum Beispiel:

element.onclick = function(e) {
    var aBetterEventObject = jQuery.Event(e);
    // Now you can do what you want: (Cross-browser)
    aBetterEventObject.preventDefault()
    aBetterEventObject.isDefaultPrevented()
    aBetterEventObject.stopPropagation()
    aBetterEventObject.isPropagationStopped()
    aBetterEventObject.stopImmediatePropagation()
    aBetterEventObject.isImmediatePropagationStopped()
}

EDIT: Lesen Sie durch Ihre Frage wieder, ich glaube nicht, Propagation ist das Problem - Sie scheinen zu wollen, um einen Event-Handler aus der Ausführung innerhalb eines Event-Handlers abbrechen - ich bin nicht sicher, dass dies möglich ist. Sie könnten einfach alle Handler entbinden ( jQuery(elem).unbind('click') ), aber ich glaube nicht, dass es das ist, was Sie wollen...

5voto

Versuchen Sie, die folgende Zeile in den jQuery-Event-Handler einzufügen:

return false;

5voto

meouw Punkte 40856

Im Anschluss an die Antwort von JimmyP. Ich habe dies versucht

$('#x').click( function(e){
    alert('hello');
});
document.getElementById('x').onclick = function(){
    $('#x').unbind('click');
    alert("goodbye");
}

Das jQuery-Ereignis wird in diesem Beispiel einmal ausgeführt. Ich glaube nicht, dass Sie sich darauf verlassen können, dass die Handler in der Reihenfolge aufgerufen werden, in der Sie sie definieren, also müssen Sie wohl akzeptieren, dass das jQuery-Ereignis einmal ausgelöst wird. Das Hinzufügen von onclick verhindert, dass das jQuery-Ereignis überhaupt ausgelöst wird, aber, wie gesagt, ich glaube nicht, dass das zuverlässig ist.

0 Stimmen

2meouw: Wie ich bereits erklärt habe, wird unbind den Handler, der 'hello' meldet, für immer verwerfen. Das ist nicht gut :) der Anwendungsfall kann sein: document.getElementById('x').onclick = function() { if ( /*irgendein Fall*/ ) { /* verhindert den Aufruf der Funktion, die 'HELLO' meldet */ } } Wenn ich also einen weiteren Klick auf das Element bekomme, könnte der Fall falsch sein und der Handler sollte aufgerufen werden. Habe ich mich klar ausgedrückt? :)

0 Stimmen

+1 Ich glaube nicht, dass Sie die Reihenfolge garantieren können, in der die Ereignisbehandler aufgerufen werden

2voto

roborourke Punkte 11932

Jquery hat eine Methode für Namespacing-Ereignisse. http://docs.jquery.com/Namespaced_Events

Sie können separate Funktionen, die an dasselbe Ereignis gebunden sind, über Namespaces hinzufügen, auslösen und entfernen:

$("a").bind("click.custom1",function(){ ... });
$("a").bind("click.custom2",function(){ ... });
$("a").trigger("click.custom2");
$("a").unbind("click.custom2");

Solange Sie die Bindung des Namespaced-Ereignisses aufheben, sollte Ihr normales Onclick-Ereignis davon nicht betroffen sein. Möglicherweise müssen Sie zwei separate Namespaces an das Klick-Ereignis wie oben binden, wenn das nicht funktioniert.

0 Stimmen

Unfortunatelly, kann ich nur ändern Handler mit Inline-Methode angehängt. Ich kann nicht beeinflussen, Bindung mit jQuery - es kann von einem anderen Entwickler getan werden, wenn er meinen Code wiederverwenden wird.

0 Stimmen

Wie sieht es dann aus? Entwickeln Sie ein Javascript, das Sie zu einem bestehenden Jquery-Skript hinzufügen? Vielleicht gibt es ein anderes Element, das Sie Ihre onclick, dass Blase bis zu dem Element mit dem Jquery-Ereignis beigefügt hinzufügen könnte.

0 Stimmen

Ich entwickle eine Art von Plugin. Kurz gesagt, für einige Fälle sollte es verhindern, dass alle Aktivitäten, die durch Ereignis auf dem Element passiert. ex. es sollte verhindern, dass alle Event-Handler auf bestimmte Ereignisse auslösen. Handler können von Benutzern angehängt werden - mit Jquery oder Inline-Technik.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X