Обработчик ошибок не вызывается при загрузке файла через Ajax с использованием плагина формы jQuery - PullRequest
2 голосов
/ 13 мая 2010

Вот мой тестовый пример. Если форма размещена, отправляется 500 ошибок. Если нет, то форма отправляется.

Если тег ввода файла закомментирован, вызывается обработчик ошибок. Если присутствует тег ввода файла, обработчик ошибок не вызывается. Я думаю, что это может быть связано с тем, что jQuery должен использовать iframe для обработки загрузки, а iframes , похоже, не отвечает на обработчик ошибок .

Edit: Если я добавлю iframe: true к опциям, переданным в ajaxSubmit, чтобы принудительно использовать iframe, дело, не относящееся к загрузке файлов, также перестанет работать, поэтому оно определенно связано с iframe.

Edit2: я использую плагин jQuery Form .

<?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 }

Есть ли способ заставить обработчик ошибок вызываться в обеих ситуациях?

Ответы [ 3 ]

1 голос
/ 13 мая 2010

Насколько я могу судить по просмотру кода .ajaxSubmit, не предпринимается никаких попыток обнаружить или обработать ошибки в случае, если вы отправили <iframe>. Я подозреваю, что это потому, что у него просто нет возможности узнать код ошибки, полученный с сервера в ответе HTTP, нацеленном на <iframe>. Он вызывает плагины «success» и «complete» и пытается собрать воедино поддельный объект xhr, используя все, что находит в DOM в <iframe>.

0 голосов
/ 17 октября 2010

LTTP, но чтобы это работало без использования разветвленного плагина jquery.form, установите для параметра dataType значение 'json':

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

, а затем заставьте сервер возвращать тривиальный ответ в случае успеха(который интерпретируется как действительный JSON) вместо простого ответа 200 OK.Может быть так просто, как:

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

Это убеждает плагин обрабатывать ответ 5XX об ошибке.

0 голосов
/ 13 мая 2010

Мне кажется, что вы используете неправильный плагин отправки формы ajaxSubmit(). Если код ajaxSubmit соответствует коду из http://be.twixt.us/jquery/formSubmission.php,, такие параметры, как {error: ..,}, будут игнорироваться ajaxSubmit().

ajaxSubmit() используйте $ .post для выполнения ajax-запроса, поэтому вы можете определить error обратный вызов jQuery.ajaxSetup() (см. http://api.jquery.com/jQuery.ajaxSetup/ и http://api.jquery.com/jQuery.ajax/)

ОБНОВЛЕНО: Как я могу видеть из источника используемого вами плагина (см. http://github.com/malsup/form/raw/master/jquery.form.js?v2.43) $ .ajax (опции); будет использоваться только в другой части следующего оператора if:

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

, поэтому во всех остальных случаях вы не можете использовать error в качестве параметра ajaxSubmit(). Таким образом, вы можете установить {closeKeepAlive: true} в качестве параметра ajaxSubmit() and don't forget to set before error callback by jQuery.ajaxSetup () `, как я описал ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...