代码之家  ›  专栏  ›  技术社区  ›  Edward Dale

当使用jquery表单插件通过Ajax上载文件时,不会调用错误处理程序。

  •  2
  • Edward Dale  · 技术社区  · 15 年前

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

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

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

    我用的是 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 回复  |  直到 14 年前
        1
  •  1
  •   Pointy    15 年前

    据我所知 .ajaxSubmit 代码,如果您已提交给 <iframe> . 我怀疑这是因为它无法了解从服务器返回的HTTP响应中针对 <iFrAME> . 它确实称为“成功”和“完整”插件,并试图使用在DOM中找到的任何东西来拼凑一个伪造的XHR对象。 <iFrAME> .

        2
  •  0
  •   Oleg    15 年前

    在我看来,您使用的表单提交插件不正确 ajaxSubmit() . 如果代码 ajaxSubmit 与来自的代码相对应 http://be.twixt.us/jquery/formSubmission.php ,参数错误:..,将被忽略 Ajax子() .

    Ajax子() 使用$.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);
    

    所以在其他情况下你不能使用 错误 作为参数 Ajax子() . 所以你可以设定 {closeKeepAlive: true} 作为参数 ajaxSubmit() and don't forget to set before 错误 callback by jquery.ajaxsetup()`如前所述。

        3
  •  0
  •   Rebecca Scott    14 年前

    LTTP,但是要使它在不使用分叉jquery.form插件的情况下工作,请设置 dataType 选择权 'json' :

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

    然后让服务器在成功时返回一个微不足道的响应(这被解释为有效的JSON),而不是直接返回 200 OK 反应。可以简单到:

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

    这使插件能够处理5xx错误响应。