2010-07-21 10 views
32
<form method="post" action="load_statements.php?action=load" id="loadForm" 
          enctype="multipart/form-data"> 

das ist meine Form, die mir gut aussieht. in dieser Form, habe ich diese Schaltfläche:

<input type="button" name="submit" id="submit" value="Submit" onclick="confirmSubmit()" class="smallGreenButton" /> 

hier ist die Funktion, es nennt.

function confirmSubmit() { 
    // get the number of statements that are matched 
    $.post(
     "load_statements.php?action=checkForReplace", 
     { 
      statementType : $("#statementType").val(), 
      year : $("#year").val() 
     }, 
     function(data) { 
      if(data['alreadyExists']) { 
       if(confirm("Statements already exist for " + $("#statementType").html() + " " + $("#year").val() + 
        ". Are you sure you want to load more statements with these settings? (Note: All duplicate files will be replaced)" 
       )) { 
        $("#loadForm").submit(); 
       } 
      } else { 
       $("#loadForm").submit(); 
      } 
     }, "json" 
    ); 
} 

und wie Sie sehen können, ist es $("#loadForm").submit(); nennt, aber die Form der Einreichung nicht (dh die Seite ist nicht erfrischend). Warum das?

danke!

+0

Haben Sie einen Haltepunkt erreicht, wenn Sie es ausdrückte auf den submit call? – mackenir

+0

Ja, es läuft, aber das Formular aus irgendeinem Grund nicht tatsächlich übermittelt. – Garrett

Antwort

17

http://api.jquery.com/submit/

Die jQuery submit() Ereignis mit von Seite verlassen fügt einen Ereignis-Listener zu geschehen, wenn Sie das Formular abschicken. Ihr Code bindet also im Wesentlichen nichts an das Submit-Ereignis. Wenn Sie möchten, dass dieses Formular gesendet wird, verwenden Sie Old-School-JavaScript (document.formName.submit()).

edit:

ich meine ursprüngliche Antwort intakt bleibt darauf zu hinweisen, wo ich weg war (wie mindestens zwei Personen bereits Downvoted mich). Was ich sagen möchte, ist, dass wenn Sie eine Funktion wie diese haben, es verwirrend ist, warum Sie die Werte in einem Ajax-Teil posten und dann jQuery verwenden, um das Formular zu senden. In diesem Fall würde ich das Ereignis an den Klick auf den Button binden, und dann true zurück, wenn Sie es wollen zurückzukehren, andernfalls false zurückgeben, wie so

$('#submit').click(function() { 
    // ajax logic to test for what you want 
    if (ajaxtrue) { return confirm(whatever); } else { return true;} 
}); 

Wenn diese Funktion true zurückgibt, dann zählt es als erfolgreicher Klick auf den Submit Button und das normale Browser Verhalten passiert. Dann haben Sie auch die Logik vom Markup in Form eines Event-Handlers getrennt.

Machen Sie mehr Sinn?

+4

Das ist, wenn Sie eine Funktion übergeben. Wenn Sie einfach submit() aufrufen, wird die Standardübermittlungsaktion für das Formular ausgelöst, sodass das Formular gesendet wird. – Yisroel

+0

... angeblich ... aber aus irgendeinem Grund, nein = ( – Garrett

+1

Ich habe die Antwort aktualisiert, um zu erklären, was ich meinte. Ich war nicht sehr klar, das war mein schlechtes. – NateDSaint

-1

Sieht so aus, als hätten Sie das Senden in einem Callback ausgeführt, das nur nach einem Ajax-Post in Ihrem onclick-Handler ausgeführt wird.

Mit anderen Worten, wenn Sie auf Senden klicken, muss der Browser zuerst ausgehen und die checkForReplace Aktion treffen.

+0

ja, was es tut, und dann trifft $ ("# loadForm"). Submit(); 'was nichts tut. – Garrett

-3

sein Ajax-Aufruf, warum Sie Ihr Formular senden müssen, während Sie es bereits mit Ajax verarbeiten. Sie können

window.location.href = "/somewhere/else"; 
+0

Ich muss einen Teil davon vorher verarbeiten, um dem Benutzer die korrekte confirm() -Anweisung zu geben. – Garrett

4

i hinzugefügt eine unsichtbare Schaltfläche zum Formular abgesendet haben, und stattdessen die submit() Funktion aufrufen, nenne ich das Click() Funktion auf dem Absenden-Button =)

die Taste: <div style="display:none"><input id="alternateSubmit" type="submit" /></div>

Der verrückte Weg, um das Formular Vorlage zu umgehen: $("#alternateSubmit").click();

+0

Ich habe meine Antwort aktualisiert, um ein neues po einzufügen Lösung, die ich erfolgreich getestet habe, kann ich den Code dafür zur Verfügung stellen, wenn Sie es wünschen. – NateDSaint

70

Ändern Sie die Schaltfläche "Senden" zu etwas anderem. Das verursacht das Problem. See dennisjq Antwort auf: http://forum.jquery.com/topic/submiting-a-form-programmatically-not-working

Siehe jQuery submit() Dokumentation:

Formulare und ihre untergeordneten Elemente sollten nicht eingegeben Namen oder IDs, die Konflikt mit Eigenschaften einer Form, wie einreichen verwenden , Länge oder Methode. Namenskonflikte können zu verwirrenden Fehlern führen. Eine vollständige Liste der -Regeln und zum Überprüfen Ihrer Markierung für diese Probleme finden Sie unter DOMLint.

+0

Dies scheint die richtige Antwort zu sein, nicht die anderen. Zumindest war es in meinem Fall das genaue Problem und scheint das Problem in der Frage zu sein. Die anderen Antworten scheinen falsch zu sein. – arunkumar

+0

Ich testete den gleichen Fall und fand heraus, dass die Änderung von 'id' oder 'name' Attributen immer noch den gleichen Fehler erzeugen. –

+7

Das war die Antwort für mich. Es dauerte ewig, um herauszufinden, –

19

Ich benutze $("form")[0].submit()

hier $("form") ein Array von DOM-Elementen gibt so durch den entsprechenden Index zugreifen wir das DOM-Objekt für das Formularelement erhalten und führen Sie die submit() Funktion innerhalb dieses DOM-Element.

Draw zurück, wenn Sie mehrere Formularelemente innerhalb einer HTML-Seite haben Sie eine Vorstellung über die richtige Reihenfolge der „Form“ haben, haben s

+0

Das Problem für mich behoben, +1 – Angad

+1

@Garrett '$ (" # loadForm ") [0] .submit();' funktioniert für mich. Es scheint, dass 'submit()' nicht auf einem Array von Elementen funktioniert, die von '$ (" # loadForm ") Selektor zurückgegeben werden. – hongster

13

Ich hatte ein ähnliches Problem, dauerte eine Weile, um es herauszufinden. Die Funktion .submit() von jQuery sollte eine Formularübergabe auslösen, wenn Sie keinen Handler übergeben, aber der Grund dafür ist, dass Ihre Übergabeschaltfläche den Namen "submit" hat und die Übergabefunktion des Formulars außer Kraft setzt.

d. H. JQuery ruft die <form>.submit()-Funktion des DOM-Objekts auf, aber alle Eingaben innerhalb eines Formulars können auch durch Aufrufen von <form>.<inputname> aufgerufen werden. Wenn also einer Ihrer Eingaben den Namen 'submit' hat, wird die <form>.submit()-Funktion mit <form>.submit außer Kraft gesetzt - das Eingabe-DOM-Element ... wenn das Sinn macht? Wenn jQuery <form>.submit() aufruft, funktioniert das nicht, weil submit keine Funktion mehr ist. Also, wenn Sie den Namen Ihrer Schaltfläche ändern, sollte es funktionieren.

Nicht sicher, warum die Konsole einen Fehler nicht protokolliert, möglicherweise überprüft jQuery zuerst, dass die Übergabefunktion vorhanden ist, und ignoriert nur die Anforderung, wenn die Funktion nicht vorhanden ist.

+0

Entschuldigung, mein Beitrag ist nicht wie erwartet ausgefallen. der zweite Absatz sollte lauten: , d. h. jQuery ruft die Funktion form.submit() des DOM-Objekts auf, aber alle Eingaben in einem Formular können auch durch Aufrufen von form.inputname aufgerufen werden. Wenn also einer Ihrer Inputs 'submit' heißt, überschreibt er die form.submit() -Funktion mit form.submit - was das DOM-Input-Element ist ... wenn das Sinn macht? Wenn also jQuery form.submit() aufruft, funktioniert es nicht, da submit keine Funktion mehr ist. – Donovan

+0

Heute habe ich das gleiche Problem und Ihre Lösung arbeitete für mich +10 von meiner Seite. Vielen Dank. –

2

Lösch Attribut "name" in der Submit-Button:

dies Ihr Code:

<input type="button" name="submit" id="submit" value="Submit" onclick="confirmSubmit()" class="smallGreenButton" /> 

so sein sollte:

<input type="button" id="submit" value="Submit" onclick="confirmSubmit()" class="smallGreenButton" /> 
+0

Es funktioniert auch, wenn Sie den Namen von "submit" zu etwas anderem ändern –

Verwandte Themen