jQuery Multiple Event Handler – Wie kündige ich?

Lesezeit: 4 Minuten

Benutzer-Avatar
Josh Stodola

Ich habe zwei Funktionen, die zu zwei verschiedenen Zeiten an ein Klickereignis gebunden sind (mit jQuery). Die Reihenfolge, in der sie abgefeuert werden, ist signifikant. Sie schießen in der richtigen Reihenfolge. Das Problem ist, wenn die erste Funktion falsch zurückgibt, wird die zweite Funktion immer noch ausgelöst!

Wie kann ich die Veranstaltung ordnungsgemäß stornieren?

Beispielcode:

$(document).click(function() { 
  alert('a');
  return false;
});

$(document).click(function() {
  alert('b');
});

Beim Klicken auf die Seite wird weiterhin die Warnmeldung „b“ angezeigt. Das ist inakzeptabel!

Verwenden Sie die stopImmediatePropagation Funktion des jQuery-Ereignisobjekts.

Verhindert, dass der Rest der Handler ausgeführt wird. Diese Methode stoppt auch das Sprudeln, indem sie event.stopPropagation() aufruft.

$(document).click(function(event) { 
  alert('a');
  event.stopImmediatePropagation();
  return false;
});

$(document).click(function() {
  alert('b');
});

  • Beachten Sie, dass Sie jQuery Version 1.3 und höher verwenden müssen, damit dies funktioniert.

    – Josh Stodola

    17. März 2009 um 0:08 Uhr

  • was ist mit $(document).on(“touchstart click”, “.myelement”, function(e) {e.stopImmediatePropagtion(); //run function here})…If the touchstart fires first on the tablet device will Wird der Klick abgebrochen, wenn ich meinen Finger gedrückt halte?

    – Alex

    28. Juni 2012 um 18:52 Uhr


Das erste, was ich frage, ist: Warum haben Sie zwei Funktionen, die an dasselbe Klickereignis gebunden sind? Wenn Sie Zugriff auf den Code haben, warum machen Sie nicht einfach diesen einen einzigen Anruf?

$(function (){
    var callbackOne = function(e){
        alert("I'm the first callback... Warning, I might return false!");
        return false;
    };

    var callbackTwo = function(e){
        alert("I'm the second callback");
    };

    $(document).click(function (e){
        if(callbackOne(e)){
            callbackTwo(e);
        }
    });
});

  • Organisation. Diese App enthält eine Menge Javascript-Code, der in MEHRERE Dateien aufgeteilt ist. Auf diese Weise lädt jede Seite nur das Notwendige herunter, was zu schnellen Ladezeiten führt. Ich habe einen HTTP-Handler, der sie auch kombiniert, komprimiert und zwischenspeichert, sodass sie alle in einer Anfrage abgerufen werden.

    – Josh Stodola

    16. März 2009 um 23:32 Uhr

  • OK. Gibt es also wirklich die Notwendigkeit für -1? Ich versuche nur zu helfen … Ihre Erklärung reicht aus, um uns alle wissen zu lassen, dass dies nicht die Lösung ist für dich.

    – Seb

    16. März 2009 um 23:34 Uhr

  • Dann bitte ich um Entschuldigung! 🙂 Ich weiß nicht, wer seinen Ruf verschwenden möchte, indem er eine mögliche gültige Antwort für andere Leute herunterstimmt …

    – Seb

    16. März 2009 um 23:37 Uhr

  • +1. Ich habe viele Fragen beantwortet, indem ich gefragt habe: “Warum machst du es so und nicht so?” Manchmal ist sich der Fragesteller nicht bewusst oder hat vergessen, andere Optionen in Betracht zu ziehen.

    – Spencer Ruport

    17. März 2009 um 0:24 Uhr

Benutzer-Avatar
Rodrigo Jara

Danke, Unbind funktioniert zum Neudefinieren von Funktionen.

  $(document).ready(function(){
        $("#buscar_mercaderia").click(function(){ alert('Seleccione Tipo de mercaderia'); 
   });
$(".tipo").live('click',function(){
            if($(this).attr('checked')!=''){
                if($(this).val()=='libro'){
                    $("#buscar_mercaderia").unbind('click');
                    $("#buscar_mercaderia").click(function(){  window.open('buscar_libro.php','Buscar Libros', 'width=800,height=500'); });
                }else if($(this).val()=='otra'){
                    $("#buscar_mercaderia").unbind('click');
                    $("#buscar_mercaderia").click(function(){ window.open('buscar_mercaderia.php','Buscar Mercaderias', 'width=800,height=500');  });
                }
            }
        })

Hilft das Aufheben der Bindung?

$(document).click(function() { 
  alert('a');
  $(this).unbind('click');
  return false;
});

Benutzer-Avatar
fmsf

Wenn das, was nickf gesagt hat, nicht funktioniert, können Sie eine kleine Zustandsmaschine verwenden:

var trigger = 0;

$(document).click(function() { 

  alert('a');
  if(you_want_to_return_false) {
    trigger = 1;
    return false;
  }
});

$(document).click(function() {
  if(trigger !== 0) {
  alert('b');
  } 
  trigger = 0;
});

Nicht die schönste Lösung, aber es geht.

  • naja, meine idee funktioniert es ist nur so, dass es gleichzeitig bricht. +1 für diese Idee.

    – Nickf

    16. März 2009 um 23:20 Uhr

  • Diese Methode bricht genauso ab wie die andere, außer mit mehr Code. Korrigiere mich, wenn ich falsch liege.

    – Josh Stodola

    16. März 2009 um 23:22 Uhr

Benutzer-Avatar
Spencer Miles

Eine andere Lösung besteht darin, die Funktion zu entprellen oder zu drosseln.

Auf diese Weise können Sie sicherstellen, dass es trotz mehrmaligem Auslösen nur innerhalb einer festgelegten Dauer ausgeführt wird. Dadurch würde Ihr Code so funktionieren, wie er ist.

  • naja, meine idee funktioniert es ist nur so, dass es gleichzeitig bricht. +1 für diese Idee.

    – Nickf

    16. März 2009 um 23:20 Uhr

  • Diese Methode bricht genauso ab wie die andere, außer mit mehr Code. Korrigiere mich, wenn ich falsch liege.

    – Josh Stodola

    16. März 2009 um 23:22 Uhr

1270850cookie-checkjQuery Multiple Event Handler – Wie kündige ich?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy