使用jQuery表单插件通过Ajax上传文件时,不会调用错误处理程序

时间:2010-05-13 12:06:56

标签: javascript jquery ajax upload

这是我的测试用例。如果表单已过帐,则会发送500错误响应。如果没有,则发送表格。

如果文件输入标记已注释掉,则会调用错误处理程序。如果存在文件输入标记,则不会调用错误处理程序。我认为这可能与jQuery需要使用iframe来处理上传和iframe don't seem to respond to the error handler这一事实有关。

编辑: 如果我将iframe: true添加到传递给ajaxSubmit的选项以强制使用iframe,则非文件上传案例也会停止工作,因此它肯定与iframe有关。

Edit2:我正在使用jQuery Form 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 }

有两种方法可以在两种情况下调用错误处理程序吗?

3 个答案:

答案 0 :(得分:1)

据我所知,.ajaxSubmit代码,在您提交给<iframe>的情况下,没有尝试检测或处理错误。我怀疑这是因为它没有办法了解针对<iframe>的HTTP响应中从服务器返回的错误代码。它确实调用了“成功”和“完整”插件,并尝试使用它在<iframe>中的DOM中找到的任何内容来拼凑假xhr对象。

答案 1 :(得分:0)

在我看来,您使用了错误的表单提交插件ajaxSubmit()。如果ajaxSubmit的代码与http://be.twixt.us/jquery/formSubmission.php中的代码相对应,ajaxSubmit()将忽略{error:..,}等参数。

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(options);将仅用于以下if语句中的else部分:

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错误callback by jQuery.ajaxSetup()`的参数,如前所述。

答案 2 :(得分:0)

LTTP,但要在不使用分叉的jquery.form插件的情况下使其工作,请将dataType选项设置为'json'

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

然后让服务器在成功时返回一个简单的响应(它被解释为有效的JSON),而不是裸200 OK响应。可以这么简单:

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

这说服该插件处理5XX错误响应。