Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get jQuery.ajax response status?

Is there any way to know if the jqXHR object returned was redirected from another request? For example, having the following code:

   jQuery.ajax({
            type:       'POST',
            url:        'http://example.com/page.html',
            complete:   function(response, status) {
                        console.log(response.statusCode);
                        // do something
                        }
        });

If the ajax url is redirected with a 301 or 302 status code, the response will be the result of the redirected page and will return a 200 (OK) status code. I think this is a jQuery's bug (don't really know if this is the intended beheavior, since the ultimate response was actually succesful) I can't either get the original response Headers to check if there exists a Location Header, since this is only available on redirected requests.

Firebug with the above code logs these two requests through XHR

http://example.com/page.html 302 (Moved temporarily) http://example.com/redirect.html 200 (OK)

But jQuery only return data from the second request.

Maybe there is a way to get data from the first request? Or to get the response url and compare it with the one from the original request?

like image 210
Luis Avatar asked Aug 02 '11 03:08

Luis


People also ask

How do I get AJAX response in HTML?

To retrieve that page using jQuery's AJAX function, you would simply use some javascript similar to the following. $. ajax({ url: 'test. html', dataType: 'html' });

Does AJAX wait for response?

ajax() function with the default settings, any JavaScript code after this AJAX request will be executed without waiting for a response. In most cases, this is the desired behavior, but there are some situations where you will want to prevent further execution until there has been a response to the AJAX call.

What is responseText in jQuery?

The responseText method is used for all formats that are not based on XML. It returns an exact representation of the response as a string. Plain text, (X)HTML, and JSON are all formats that use responseText.


1 Answers

The issue is that a 301 or 302 is handled directly by the browser due to standards compliance. This status code is not passed on to your ajax call. The only way that you know that the call has completed is in the complete handler, and furthermore there is no useful status given in the jqxhr object passed to complete. The Success and Error handlers will never get called.

We had some legacy ruby camping code that used a redirect to the get() method when a post() method was called so that we could display an updated view via ruby of the resource. When we switched to JavaScript views from camping views, the 301/302 was not passed to the jqxhr object. We had to rewrite the post methods to return 200 to fix the issue.

Here are some stackoverflow posts on the subject.

How to manage a redirect request after a jQuery Ajax call

Catching 302 FOUND in JavaScript

HTTP redirect: 301 (permanent) vs. 302 (temporary)

like image 199
DRaehal Avatar answered Nov 15 '22 18:11

DRaehal