看来Jquery.Form插件中没有错误处理工具,这是非常令人沮丧的。尽管文档说明我们可以使用$ .ajax选项,但是当服务器返回错误时,我仍然无法使用’error’选项,特别是500和400系列。是不是这个插件无法处理从服务器的任何错误或是一个错误等?
有人可以告诉我如何处理这个插件的错误(400,500等)?我需要你的帮助…所有我想要的是一个简单的错误处理…谢谢。
有人可以告诉我如何处理这个插件的错误(400,500等)?我需要你的帮助…所有我想要的是一个简单的错误处理…谢谢。
$("#uploadingImg").hide(); var options = {//Define ajax options type: "post",target: "#responsePanel",beforeSend: function(){ $("#uploadingImg").show(); },complete: function(xhr,textStatus){ $("#uploadingImg").hide(); },success: function(response,statusString,xhr,$form){ // I know what to do here since this option works fine },error: function(response,status,err){ // This option doesn't catch any of the error below,// everything is always 'OK' a.k.a 200 if(response.status == 400){ console.log("Sorry,this is bad request!"); } if(response.status == 601){ sessionTimedOut(); } } } $("#polygonUploadForm").submit(function(){ $(this).ajaxSubmit(options); // Using the jquery.form plugin return false; });
解决方法
jQuery表单插件确实处理错误,
documentation是正确的,表示它可以使用$ .ajax选项。但是插件可以运行两种模式 – 正常和文件上传。您遇到的问题是因为您正在执行文件上传。 (你不说这个,但你有“#uploadingImg”和“#polygonUploadForm”,并且递归推理,你有这个问题。)
这通常被声明,但是您无法使用AJAX上传文件。此解决方法是使用iframe。表单提交POST一个正常的HTTP请求,并在iframe中加载服务器响应。插件获取响应并瞧瞧。因为这是正常的HTTP请求,所以$ .ajax的规则和行为不适用(因为它没有被使用)。 Form插件可以做的唯一一件事就是把它取得成功。在代码方面,文件上传将永远不会触发分配给ajaxForm()或ajaxSubmit()的“error”属性。如果你真的想证明这不是一个AJAX请求,请附加一个ajaxComplete()处理程序到窗体(即完全独立于Form插件的方法)。它也不会被触发。或者看看Firebug的Net-> XHR面板。
这就是说 – 上传不是一个AJAX请求。你可以做的最好的工作是在ajaxForm()/ ajaxSubmit()的’成功’或’完整’回调中工作。您无限制地访问实际的HTTP响应代码,但您可以检查响应。如果响应是空的或不是您期望的,您可以通过调用xhr.abort()实际触发“错误”回调。调用abort()和触发“错误”,而不是做“if(good response){yay!} else {哦,不!}”,使代码更清晰,更易于理解。这是一个代码示例:
$("#uploadForm").ajaxForm({ success: function(response,textStatus,form) { console.log("in ajaxForm success"); if (!response.length || response != 'good') { console.log("bad or empty response"); return xhr.abort(); } console.log("All good. Do stuff"); },error: function(xhr,errorThrown) { console.log("in ajaxForm error"); },textStatus) { console.log("in ajaxForm complete"); } });
控制台日志中会打印出错误的响应:
[jquery.form] state = uninitialized "NetworkError: 404 NOT FOUND - http://server/fileupload/" [jquery.form] state = loading [jquery.form] isXml=false in ajaxForm success bad or empty response [jquery.form] aborting upload... aborted in ajaxForm error in ajaxForm complete in ajaxForm complete
我不知道为什么“完整”回调运行两次 – 任何人?
一个最后的事情,读this thread,如果你问为什么jQuery或Form插件不能只读取iframe的HTTP标头。