2016-04-11 6 views
2

ich ein globales Skript Formen mit jqueryvalidation zu validieren:jQuery Validate-Plugin, wie Form zu stoppen einreichen mit einem externen Handler

$("form").validate({ 
    submitHandler: function(form) { 
     $("body").append("<p>validate</p>"); 
     form.submit(); 
    } 
    }); 

In einer besonderen Form brauche ich eine andere „zweite“ Handler zu dieser Form hinzufügen :

$("#myform").submit(function(){ 
    $("body").append("<p>other handler</p>"); 
    return false; 
    }); 

Warum blockiert die return false; des zweiten Handlers das Formular nicht senden? Ich habe auch mit preventDefault und stopProparation versucht, aber es funktioniert nicht.

https://jsfiddle.net/brj7ttdn/5/

+0

ich diese Situation auf Ihrem jsfiddle nicht sehen können? –

+0

Sorry, meine Geige wurde nur für meine Session aktualisiert, jetzt aktualisiere ich den Link zur letzten Version. – Tobia

+0

@Tobia lassen Sie mich wissen, wenn meine Antwort hilft Ihnen –

Antwort

-1

Kann versuchen Sie die prevent() richtig wie unten:

$(function(){ 
    $("form").submit(function(event){ 
    $("body").append("<p>other handler</p>"); 
    event.preventDefault(); 
    }); 
}); 

die Fiddle prüfen.

+0

Sie fiddle funktioniert, weil Sie den ersten Validierungshandler entfernt haben. In meinem Fall habe ich 2 Handler, der erste (Global des Hauptprojekts und ich kann es nicht ändern) und meinen eigenen zu einem einzigen Formular. – Tobia

+0

Sorry, meine Fiddle wurde nur für meine Session aktualisiert, jetzt aktualisiere ich den Link zur letzten Version und jetzt denke ich, dass du meine Situation verstehen kannst. – Tobia

-1

Deaktivieren Sie Ihr Button Click Event, das Formular wird auch deaktiviert. ändern

$("#myform").submit(function(e){ 

zu

$("button").click(function(e){ 

Wenn Ihr Formular durch Drücken Eintragen "ENTER", müssen Sie keypress Aktion auslösen und Aktion einreichen stoppen mit einem Skript wie:

$("input").on("keypress", function(e){ 
    var keypress; 
    if(window.event) { // IE      
     keypress= e.keyCode; 
    } else if(e.which){ // Netscape/Firefox/Opera     
     keypress= e.which; 
    } 
    if (keypress == 13) { 
     e.preventDefault(); 
    } 
}) 
+0

Ich möchte das Formular deaktivieren, auch für "ENTER" drücken, in eine Texteingabe drücken und so weiter ... Diese Schaltfläche gibt es nur zum Einreichen von Testzwecken. – Tobia

+0

Sie reichen das Formular per Javascript ein? Ändern Sie Ihr Skript. Wenn nicht, müssen Sie auf eine Schaltfläche klicken, um Ihr Formular zu senden. –

+0

@Tobia: cuz Ihre Validierung mit submit() Aktion, keine Möglichkeit für Sie für die Verwendung eines Skripts auslösen die gleiche Aktion, um es zu deaktivieren. Sie müssen ein Ereignis auslösen, bevor die Aktion submit() aufgerufen wird. Ändern Sie also das Skript, wenn Sie das Formular mit "ENTER" absenden/oder auf eine Schaltfläche klicken. –

1

Könnten Sie vielleicht den globalen submithandler entfernen und nur den spezifischen laufen lassen? Wie folgt aus:

$(function(){ 

$("form").validate({ 
    submitHandler: function(form) { 
    $("body").append("<p>validate</p>"); 
    form.submit(); 
    } 
}); 

$('#myform').off('submit') 

$("#myform").submit(function(e){ 
    $("body").append("<p>validate</p>"); 
    $("body").append("<p>other handler</p>"); 
    e.preventDefault(); 
    }); 
}); 

Sie würden die Validierung von den anderen Handler verlangen auch, aber das ist vielleicht nicht allzu schmerzhaft sein, machen nur einen form.valid() Anruf

0

hier ein Working Fiddle ist und der Code ist wie folgt.

$(function() { 

    $("form").validate({ 
    submitHandler: function(form) { 
     $("body").append("<p>validate</p>"); 

     if ($(form).data('has-customSubmit-event') === true) { 
     $(form).trigger('customSubmit'); // trigger your custom submit. 
     } else { 
     form.submit(); 
     } 
    } 
    }); 

    $('#myform').data('has-customSubmit-event', true); // add a pointer to say there is a custom handler for this form, 

    $("#myform").on('customSubmit', function(e) { 
    $("body").append("<p>other handler</p>");  
    //$(this).submit(); // if you want to submit this form. 
    }); 

}); 

Die Idee ist, einen Zeiger zu sagen für diese Form hinzufügen, wenn seine Gültigkeit nicht die form.submit(); dh Plugin tun einreichen, aber Ihre eigene Logik ausführen und dann entweder einreichen oder vorlegen nicht.

Der Zeiger ich im Gespräch bin, ist diese

$('#myform').data('has-customSubmit-event', true);

Jetzt im Plugin-Handler unterbreiten wir dann reichen Sie ein, wenn Scheck sagen, wenn diese Form einen benutzerdefinierten Handler hat auszuführen haben kann, sonst die bilden.

if ($(form).data('has-customSubmit-event') === true) { 
    $(form).trigger('customSubmit'); // trigger your custom submit. 
} else { 
    form.submit(); 
} 

Auch die Art und Weise Sie hinzufügen, die Validierung Plugin $("form").validate({.. wie diese. Was ich herausgefunden habe, war, dass das Submit-Handler-Ereignis nur für das erste Formular ausgelöst wird (Nicht sicher warum, Fiddle With Issue).

So, es zu beheben eine each() Funktion eine Schleife durch alle Formulare und das Plugin einzeln binden, Example Fiddle

+0

Ich dachte über diese Lösung nach, das Hauptproblem ist, dass ich den zweiten Handler nur ausführen muss, wenn das Formular validater ist, also würde ich die Oppositor-Reihenfolge bevorzugen, wenn ich Event-Bubbling steuern kann. – Tobia

+0

Dies ist nicht gut gestaltete Strömung. Wenn Sie so etwas machen möchten, schreiben Sie eine Validierungsfunktion und nennen Sie es, Ihr Design birgt ein gewisses Risiko für die Abfolge von Prozessen. –

+0

@Tobia Ich habe meine Antwort aktualisiert, überprüfen Sie, ob dies für Sie funktioniert. –