11 Stimme

jQuery: event.preventDefault innerhalb eines GET oder POST Requests setzen

Frage von Axuter | 10.11.2011 um 13:52

Ich habe eine Submit-Form auf einer Seite, die nur dann abgeschickt werden soll, wenn eine bestimmte Bedingung erfüllt ist. 

Das Problem ist, dass diese Bedingung zum Zeitpunkt der Ausführung des Skripts noch nicht feststeht, weswegen ich sie mit einem jQuery .get() oder .post() nachladen möchte. Je nachdem, was das Ergebnis dieses Nachladens ist, soll ein event.preventDefault gesetzt werden, um das Abschicken zu verhindern, oder nicht.

Bisher habe ich folgenden JavaScript Code erarbeitet:

$("#formid").submit(function(event){
    // request:
    $.post("script.php",$(this).serialize(),function(msg){
        // bei bestimmtem Inhalt Submit verhindern
        if (msg=='xx') event.preventDefault();
    });
});

Nun gibt es aber ein Problem: Das ganze funktioniert einfach nicht und ich habe keine Ahnung wieso! Wenn ich das prevenDefault außerhalb der POST (oder auch GET Abfrage, ich habe beides probiert), setze, dann funktioniert es tadellos. Aber ich brauche es ja innerhalb des POST oder GET-Requests, da ja hier die Bedingung gestellt wird.

Kann mir jemand helfen und mir einen Lösungsansatz geben?

AntwortenPositivNegativ
1Beste Antwort1 Stimme

Probiere es einfach mal mit folgendem Lösungsansatz, indem du den .post()-Request in einen .ajax()-Request umwandelst und dabei async auf false setzt:

$("#formid").submit(function(event){
   $.ajax({
      type: "POST",
      url: "script.php",
      data: $(this).serialize(),
      async: false,
      success: function(msg) {
        if (msg=='xx') event.preventDefault();
      }
   });
});

Der .post()-Request von jQuery läuft nämlich asynchron ab. Das bedeutet, das eigentliche Skript wird weiter abgearbeitet, während die POST oder GET Abfarge gesendet wird.

Dadurch ist das Formular schon längst abgesendet, bevor unsere Daten ankommen würden und der preventDefault Befehl kommt gar nicht dazu ausgeführt zu werden.

Verwenden wir stattdessen .ajax(), können wir selbst bestimmen, ob die Anfrage asynchron durchgeführt werden soll oder nicht. Wenn wir async auf false setzen, wird der POST-Request erst durchgeführt - erst anschließend wird der Code weiter abgearbeitet. Auf die Daten wird also gewartet und preventDefault hat genug Zeit um ausgeführt zu werden.
12.11.2011 um 19:35

AntwortenPositiv Negativ
Antworten

Ähnliche Themen

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.