Ich möchte eine Veranstaltung abhalten, bis ich bereit bin, sie auszulösen, z
$('.button').live('click', function(e){
e.preventDefault();
// do lots of stuff
e.run() //this proceeds with the normal event
}
Gibt es ein Äquivalent zu der run()
oben beschriebenen Funktion?
jquery
jquery-events
Mazatec
quelle
quelle
Antworten:
Nee. Sobald die Veranstaltung abgesagt wurde, wird sie abgesagt.
Sie können das Ereignis jedoch später erneut auslösen, indem Sie mithilfe eines Flags feststellen, ob Ihr benutzerdefinierter Code bereits ausgeführt wurde oder nicht - wie folgt (bitte ignorieren Sie die offensichtliche Verschmutzung des Namespace):
Eine allgemeinere Variante (mit dem zusätzlichen Vorteil, die Verschmutzung durch globale Namespaces zu vermeiden) könnte sein:
Verwendung:
Bonus super-minimalistisches jQuery-Plugin mit
Promise
Unterstützung:Verwendung:
quelle
lots_of_stuff_already_done = true;
Flag zu setzen - andernfalls kann die Funktion nicht weiter rekursiv sein.Eine neuere Version der akzeptierten Antwort.
Kurzfassung:
Ein guter Anwendungsfall für so etwas ist, wenn Sie möglicherweise über einen alten Formularcode verfügen, der funktioniert. Sie wurden jedoch gebeten, das Formular zu erweitern, indem Sie vor dem Absenden des Formulars eine Bestätigung der E-Mail-Adresse hinzufügen. Anstatt die Postleitzahl des Back-End-Formulars zu durchsuchen, können Sie eine API schreiben und dann Ihren Front-End-Code so aktualisieren, dass diese API zuerst aufgerufen wird, bevor das Formular den traditionellen POST ausführen kann.
Dazu können Sie Code implementieren, der dem ähnelt, den ich hier geschrieben habe:
quelle
Sie können so etwas tun
quelle
Überschreiben Sie die Eigenschaft
isDefaultPrevented
wie folgt :IMHO ist dies die vollständigste Möglichkeit, das Ereignis mit genau denselben Daten erneut auszulösen.
quelle
e
ist nicht definiert. sollte seinevt.preventDefault()
. Ich habe versucht zu bearbeiten, aber meine Änderungen müssen> 6 Zeichen sein und ich habe gerade 2 :(event.isPropagationStopped = function(){ return false; };
. Ich habe dem Ereignis auch eine benutzerdefinierte Eigenschaft hinzugefügt, damit ich im Handler erkennen kann, ob die Prüfung, die die Aktion verhindert hat, ausgeführt wurde, sodass sie nicht erneut ausgeführt wird. Toll!Es ist möglich , die Verwendung
currentTarget
derevent
. Das Beispiel zeigt, wie Sie mit dem Senden des Formulars fortfahren. Ebenso könnten Sie Funktion vononclick
Attribut usw. erhalten.quelle
submit()
dasselbe Element aufrufen , kehren Sie dann nicht zu Ihrem Code "$ (" form "). on (" submit ") zurück und wiederholen ihn immer wieder?Nur nicht
e.preventDefault();
oder nur bedingt ausführen.Sie können sicherlich nicht ändern, wann die ursprüngliche Ereignisaktion auftritt.
Wenn Sie das ursprüngliche UI-Ereignis einige Zeit später "neu erstellen" möchten (z. B. im Rückruf für eine AJAX-Anfrage), müssen Sie es nur auf eine andere Weise vortäuschen (wie in der Antwort von vzwick) ... obwohl ich es tun würde die Verwendbarkeit eines solchen Ansatzes in Frage stellen.
quelle
Eine neuere Antwort verwendet geschickt
jQuery.one()
https://stackoverflow.com/a/41440902/510905
quelle
Solange "viele Dinge" nichts Asynchrones tun, ist dies absolut unnötig. Das Ereignis ruft jeden Handler auf seinem Weg nacheinander auf. Wenn also ein Onklick-Ereignis für ein übergeordnetes Element vorliegt, wird dies nach dem Onclik ausgelöst. Ereignis des Kindes hat vollständig verarbeitet. Javascript führt hier kein "Multithreading" durch, wodurch das "Stoppen" der Ereignisverarbeitung erforderlich wird. Fazit: Das "Anhalten" eines Ereignisses, nur um es im selben Handler fortzusetzen, macht keinen Sinn.
wenn „viele Sachen“ ist etwas asynchron dies macht auch keinen Sinn , da sie die asynchronen Dinge verhindert zu tun , was sie tun sollen (asynchrone Sachen) und machen sie bahave wie alles in der Reihenfolge ist (wo wir zu meinem ersten Absatz zurückkommen )
quelle
async
-fag: api.jquery.com/jQuery.ajax ) ... aber eine synchrone Ajax-Anfrage ist in fast jedem Fall eine schlechte Idee. Es wäre also besser, eine andere Lösung zu finden.Der Ansatz, den ich benutze, ist folgender:
quelle
Die akzeptierte Lösung funktioniert nicht, wenn Sie mit einem Ankertag arbeiten. In diesem Fall können Sie nach dem Anruf nicht mehr auf den Link klicken
e.preventDefault()
. Dies liegt daran, dass das von jQuery generierte Klickereignis nur über nativen Browserereignissen liegt. Das Auslösen eines Klickereignisses auf einem Ankertag folgt also nicht dem Link. Stattdessen können Sie eine Bibliothek wie jquery-simulate verwenden , mit der Sie native Browserereignisse starten können.Weitere Details dazu finden Sie unter diesem Link
quelle
Eine andere Lösung besteht darin, window.setTimeout im Ereignis-Listener zu verwenden und den Code auszuführen, nachdem der Prozess des Ereignisses abgeschlossen ist. Etwas wie...
quelle
Ich weiß, dass dieses Thema alt ist, aber ich denke, ich kann dazu beitragen. Sie können das Standardverhalten eines Ereignisses für ein bestimmtes Element jederzeit in Ihrer Handlerfunktion auslösen, wenn Sie dieses Verhalten bereits kennen. Wenn Sie beispielsweise das Klickereignis auf der Schaltfläche "Zurücksetzen" auslösen, rufen Sie die Rücksetzfunktion in der nächstgelegenen Form als Standardverhalten auf. In Ihrer Handler-Funktion können Sie nach Verwendung der PreventDefault-Funktion das Standardverhalten aufrufen, indem Sie die Reset-Funktion auf dem nächstgelegenen Formular in Ihrem Handler-Code aufrufen.
quelle
Wenn dieses Beispiel helfen kann, wird bei einigen Links ein "benutzerdefiniertes Bestätigungs-Popin" hinzugefügt (ich behalte den Code "$ .ui.Modal.confirm", dies ist nur ein Beispiel für den Rückruf, der die ursprüngliche Aktion ausführt):
quelle