Wie kann ich event.preventDefault wieder aktivieren?

79

Ich habe eine Webseite, auf der ich die Standardaktion für alle Übermittlungsschaltflächen verhindert habe. Ich möchte jedoch die Standardübermittlungsaktion für eine Schaltfläche wieder aktivieren. Wie kann ich das tun?

Ich verhindere derzeit die Standardaktion wie folgt:

$("form").bind("submit", function(e){
e.preventDefault();
});

Ich habe dies erfolgreich mit folgendem durchgeführt:

$(document).ready(function(){
$("form:not('#press')").bind("submit", function(e){
e.preventDefault();
});

Aber kann ich das dynamisch tun, wenn auf die Schaltfläche geklickt wird?

Richbits
quelle

Antworten:

123

Sie müssten das Ereignis aufheben und entweder erneut an ein separates Ereignis binden, das Default nicht verhindert, oder das Standardereignis später in der Methode nach dem Aufheben der Bindung selbst aufrufen. Es gibt kein magisches Ereignis. Abgebrochen = falsch;

Wie gewünscht

 $('form').submit( function(ev){

         ev.preventDefault();

         //later you decide you want to submit
         $(this).unbind('submit').submit()

  });
rotes Quadrat
quelle
Vielen Dank für Ihre Antwort. Können Sie mir ein Beispiel geben, wie das geht?
Richbits
3
Eines der besten Dinge, die Sie tun können, ist, PreventDefault () bei Bedarf aufzurufen, basierend auf den Bedingungen. Dies ist zwar der einzige wirkliche Weg, um genau das zu erreichen, was Sie beschrieben haben. Ich empfehle Ihnen jedoch, zu überprüfen, ob dies die beste Lösung für Ihr Problem ist. :)
Swivel
Danke dafür. Ich habe etwas Ähnliches basierend darauf gemacht, damit Google Analytics funktioniert.
Derek
Schöne, elegante Lösung. Vielen Dank!
Cooper Maruyama
1
@Swivelgames OK, aber was ich meine ist, if (someLongRunningOperation()) {e.preventDefault();}kann definitiv aus diesem Grund scheitern; Ich habe genau dieses Problem selbst getestet, kurz bevor ich meinen Kommentar geschrieben habe.
Casey
13

Entweder Sie tun, was redsquare mit diesem Code vorschlägt:

function preventDefault(e) {
    e.preventDefault();
}
$("form").bind("submit", preventDefault);

// later, now switching back
$("form#foo").unbind("submit", preventDefault);

Oder Sie weisen ein Formularattribut zu, wenn das Senden zulässig ist. Etwas wie das:

function preventDefault(e) {
    if (event.currentTarget.allowDefault) {
        return;
    }
    e.preventDefault();
}
$("form").bind("submit", preventDefault);

// later, now allowing submissions on the form
$("form#foo").get(0).allowDefault = true;
Patrice Neff
quelle
Erstaunliche einfache Lösung! Dies löste mein Problem, das Standardverhalten von iOS für das Scrollen elastischer Körper ein- und auszuschalten und einige Elemente scrollbar zu halten. Cool!
Garavani
5
function(e){ e.preventDefault();

und sein Gegenteil

function(e){ return true; }

Prost!

Foxybagga
quelle
1
Ein Problem ist, dass, wenn alles, was Sie tun möchten, zu lange dauert (z. B. einen Ajax-Aufruf tätigen), Sie möglicherweise nie "return false" oder "e.preventDefault ()" erreichen, wenn Sie es nach der Bedingung setzen.
Casey
1
$('form').submit( function(e){

     e.preventDefault();

     //later you decide you want to submit
     $(this).trigger('submit');     or     $(this).trigger('anyEvent');
Adardesign
quelle
4
Tippfehler evvs eund $(this).trigger('submit')hier wird in gleich laufen e.preventDefault(). Das ist eine schlechte Antwort.
i--
@ich danke! Ich habe es behoben. Es war ein Tippfehler
Adardesign
1

Mit asynchronen Aktionen (Timer, Ajax) können Sie die Eigenschaft folgendermaßen überschreiben isDefaultPrevented:

$('a').click(function(evt){
  e.preventDefault();

  // in async handler (ajax/timer) do these actions:
  setTimeout(function(){
    // override prevented flag to prevent jquery from discarding event
    evt.isDefaultPrevented = function(){ return false; }
    // retrigger with the exactly same event data
    $(this).trigger(evt);
  }, 1000);
}

Dies ist die vollständigste Methode, um das Ereignis mit genau denselben Daten erneut auszulösen.

Tomislav Simić
quelle
0

Ich hatte kürzlich ein ähnliches Problem. Ich hatte ein Formular und eine PHP-Funktion, die ausgeführt werden sollten, sobald das Formular gesendet wurde. Ich musste jedoch zuerst ein Javascript ausführen.

        // This variable is used in order to determine if we already did our js fun
        var window.alreadyClicked = "NO"
        $("form:not('#press')").bind("submit", function(e){
            // Check if we already run js part
            if(window.alreadyClicked == "NO"){
                // Prevent page refresh
                e.preventDefault();
                // Change variable value so next time we submit the form the js wont run
                window.alreadyClicked = "YES"
                // Here is your actual js you need to run before doing the php part
                xxxxxxxxxx

                // Submit the form again but since we changed the value of our variable js wont be run and page can reload (and php can do whatever you told it to)
                $("form:not('#press')").submit()
            } 
        });
Jiří Vítek
quelle
-3

Sie können die Aktionen durch Hinzufügen wieder aktivieren

this.delegateEvents();  // Re-activates the events for all the buttons

Wenn Sie es der Renderfunktion einer Backbone-JS-Ansicht hinzufügen, können Sie event.preventDefault () nach Bedarf verwenden.

user3521417
quelle