2013-02-14 19 views
22

Ich möchte eine Übermittlung über jQuery abfangen und zuerst überprüfen, ob eine Datei auf dem Server vorhanden ist. Wenn es vorhanden ist, fahren Sie mit der Anfrage fort, wenn keine Nachricht angezeigt wird und senden Sie die Anfrage nicht. Das ist, was ich habe:abfangen Formular mit jQuery senden

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

    checkIndex('upload/segments.gen').done(function() { 
     return true; 
    }).fail(function() { 
     e.preventDefault(); 
     alert("No index present!"); 
     return false; 
    }); 
}); 

ist dies die checkIndex():

function checkIndex(file){ 
    return $.ajax({ 
     url : file, 
     type:'HEAD' 
    }); 
} 

Was passiert, ist dies: Die Datei auf dem Server vorhanden ist, aber die checkIndex kehrt mit fehlschlagen. Zuerst sehe ich die Warnung Popup und dann geht es weiter und sendet die Post-Anfrage an den Server.

Ich benutze die checkIndex() auch für andere Zwecke, wo es wie erwartet funktioniert, so bin ich mir ziemlich sicher, dass der Fehler irgendwo in der Übermittlungsroutine ist. Aber ich kann nicht herausfinden, was damit nicht stimmt.

+1

Leider funktioniert das nur mit synchroner AJAX-Anfrage. Sie sollten die Schaltfläche deaktivieren und aktivieren Sie sie auf "fertig" Callback – Alexander

Antwort

43

Sie können keinen Rückruf an eine asynchrone Methode (wie Ajax) zurückgeben. Verhindern Sie stattdessen, dass alle zusammen eingereicht werden, und reichen Sie sie dann ein, wenn Sie bereit sind.

$("#methodForm").submit(function(e){ 
    e.preventDefault(); 
    var form = this; 
    checkIndex('upload/segments.gen').done(function() { 
     form.submit(); // submit bypassing the jQuery bound event 
    }).fail(function() { 
     alert("No index present!"); 
    }); 
}); 
+3

Das funktioniert nicht für mich. Ich bekomme "TypeError: form.submit ist keine Funktion" und wenn ich $ (form) .submit() verwende, wird der Submit-Handler immer wieder aufgerufen. – Rooster242

+1

Sie haben ein Element mit 'id =" submit "', ändern Sie es in etwas anderes. –

2

Es ist wirklich so arbeiten does'nt, ist checkIndex asynchron, so durch die Zeit, etwas zurückgibt, wird das Formular abgeschickt, und die Rückrechnung in einem anderen Bereich sind auch versuchen, etwas mehr wie folgt aus:

$("#methodForm").submit(function(e){ 
    e.preventDefault(); //prevent submit 
    var self = this; 
    checkIndex('upload/segments.gen').done(function() { 
     self.submit(); //submit if ajax OK 
    }).fail(function() { 
     alert("No index present!"); 
    }); 
}); 
+0

@KevinB - Ja, es wäre, änderte es! – adeneo

Verwandte Themen