这是我的测试用例。如果表单已过帐,则会发送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 }
有两种方法可以在两种情况下调用错误处理程序吗?
答案 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错误响应。