2 Stimmen

Fehlerhandler wird nicht aufgerufen, wenn eine Datei über Ajax mit dem jQuery-Form-Plugin hochgeladen wird

Hier ist mein Testfall. Wenn das Formular abgeschickt wird, wird eine 500-Fehlerantwort gesendet. Wenn nicht, wird das Formular abgeschickt.

Wenn das Dateieingabe-Tag auskommentiert ist, wird der Error-Handler aufgerufen. Wenn das Dateieingabe-Tag vorhanden ist, wird der Error-Handler nicht aufgerufen. Ich denke, dies könnte etwas mit der Tatsache zu tun haben, dass jQuery einen iframe verwenden muss, um den Upload und iframes zu behandeln scheinen nicht auf den Error-Handler zu reagieren .

Bearbeiten: Wenn ich hinzufüge iframe: true zu den Optionen, die an ajaxSubmit um die Verwendung eines iframe zu erzwingen, funktioniert auch der Fall, dass keine Datei hochgeladen wird, es hat also definitiv mit dem iframe zu tun.

Edit2: Ich verwende die jQuery-Formular-Plugin .

<?php
    if($_SERVER['REQUEST_METHOD'] == 'POST') {
        header('HTTP/1.1 500 Internal Server Error');
        die;
    } else {?>
    <html><head>
        <script type='text/javascript'
          src='http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js?ver=2.9.2'></script>
        <script type='text/javascript'
          src='http://github.com/malsup/form/raw/master/jquery.form.js?v2.43'></script>
        <script type="text/javascript">
            jQuery(document).ready(function() {
                jQuery('a').click(function() {jQuery('form').ajaxSubmit({error: function(){alert('error handler called');}})});
            });
        </script>
    </head><body>
        <form method="POST">
            <input type="text" name="mytext" />
            <input type="file" name="myfile" /><!-- comment this element out -->
            <input type="hidden" name="blah" value="blah" />
            <a>submit</a>
        </form>
    </body></html>

<?php }

Gibt es eine Möglichkeit, den Fehler-Handler in beiden Situationen aufgerufen werden?

1voto

Pointy Punkte 387467

Soweit ich das aus der Betrachtung der .ajaxSubmit Code, wird kein Versuch unternommen, Fehler zu erkennen oder zu behandeln, wenn Sie an eine <iframe> . Ich vermute, dass dies daran liegt, dass es einfach keine Möglichkeit gibt, den Fehlercode zu erfahren, der vom Server in der HTTP-Antwort zurückkam, die auf die <iframe> . Es ruft die Plugins "success" und "complete" auf und versucht, ein gefälschtes xhr-Objekt zusammenzuschustern, indem es alles verwendet, was es im DOM in der Datei <iframe> .

0voto

Oleg Punkte 219333

Es scheint mir, dass Sie ein falsches Plugin für die Formularübermittlung verwenden. ajaxSubmit() . Wenn der Code von ajaxSubmit entsprechen dem Code von http://be.twixt.us/jquery/formSubmission.php werden Parameter wie {error:..,} von ajaxSubmit() .

ajaxSubmit() Verwenden Sie $.post, um eine Ajax-Anfrage zu stellen, so können Sie error Rückruf durch jQuery.ajaxSetup() (siehe http://api.jquery.com/jQuery.ajaxSetup/ y http://api.jquery.com/jQuery.ajax/ )

AKTUALISIERT: Wie ich aus dem Quelltext des von Ihnen verwendeten Plugins ersehen kann (siehe http://github.com/malsup/form/raw/master/jquery.form.js?v2.43 ) $.ajax(options); wird nur im else-Teil der folgenden if-Anweisung verwendet:

if (files.length && options.iframe !== false) || options.iframe || found || multipart) {
    if (options.closeKeepAlive)
        $.get(options.closeKeepAlive, fileUpload);
    else
        fileUpload();
} else
     $.ajax(options);

In allen anderen Fällen können Sie also nicht error als ein Parameter von ajaxSubmit() . Sie können also einstellen {closeKeepAlive: true} als ein Parameter von ajaxSubmit() and don't forget to set before Fehler callback by jQuery.ajaxSetup()`, wie ich zuvor beschrieben habe.

0voto

Rebecca Scott Punkte 2321

LTTP, aber um dies zu erreichen, ohne ein geforktes jquery.form-Plugin zu verwenden, setzen Sie die dataType Option zu 'json' :

form.ajaxSubmit({ datatype: 'json', ...

dann den Server veranlassen, bei Erfolg eine triviale Antwort (die als gültiges JSON interpretiert wird) anstelle der bloßen 200 OK Antwort. Das kann so einfach sein wie:

header('HTTP/1.1 200 OK');
echo(0);

Dadurch wird das Plugin veranlasst, eine 5XX-Fehlerantwort zu verarbeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X