jquery form plugin, no error handling

前端 未结 5 2144
再見小時候
再見小時候 2020-12-24 14:26

It seems that there are no error handling facility in the Jquery.Form plugin, which is very frustrating. Even though the documentation says we can use the $.ajax options, I

5条回答
  •  忘掉有多难
    2020-12-24 15:17

    The jQuery Form Plugin does handle errors and the documentation is correct in stating it can use the $.ajax options. However there are two modes the plugin will run in - normal and file upload. The problem you are having is because you are performing a file upload. (You don't say this but you have "#uploadingImg" and "#polygonUploadForm" and, recursive reasoning, you are having this problem.)

    This is commonly stated, but you can't upload a file with AJAX. This workaround is to use an iframe. Form submit POSTs a normal HTTP request and loads the server response in the iframe. The plugin grabs the response and voila. Because this happens as a normal HTTP request, the rules and behaviors of $.ajax don't apply (because it isn't being used). The only thing Form plugin can do is treat whatever it gets as a success. In code terms, file uploading will never trigger the 'error' attribute assigned to ajaxForm() or ajaxSubmit(). If you really want to prove this isn't an AJAX request, attach an ajaxComplete() handler to the form (i.e. completely independent of the Form plugin's methods). It won't get triggered either. Or look at Firebug's Net->XHR panel.

    So that's that - the upload is not an AJAX request. The best you can do is work within the 'success' or 'complete' callbacks of ajaxForm()/ajaxSubmit(). You are limited without access to the actual HTTP response code, but you can examine the response. If the response is empty or not what you expect, you can actually trigger the 'error' callback by calling xhr.abort(). Instead of doing "if(good response) {yay!} else {oh no!}", calling abort() and triggering 'error' makes the code a little cleaner and more understandable IMHO. Here's a code example:

    $("#uploadForm").ajaxForm({
        success: function(response, textStatus, xhr, 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, textStatus, errorThrown) {
            console.log("in ajaxForm error");
        },
        complete: function(xhr, textStatus) {
            console.log("in ajaxForm complete");
        }
    });
    

    A bad will response will print this in the console log:

    [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
    

    I don't know why the 'complete' callback is run twice - anyone? One final thing, read this thread if you are asking why jQuery or the Form plugin can't just read the HTTP headers of the iframe.

提交回复
热议问题