开发者

Asynchronous AJAX query with jQuery

how can I do the following by means of jQuery?

var xmlhttp;

if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp = new XMLHttpRequest();
}
else {// code for IE6, IE5
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
  开发者_如何学C      document.getElementByID('statusDisplay').innerHTML = xmlhttp.responseText; // show loaded content
    } else if (xmlhttp.readyState >= 1 && xmlhttp.status == 200) /* if(xmlhttp.readyState>=2 && xmlhttp.status==200) */ {
        document.getElementByID('statusDisplay').innerHTML = '<img src="ajax_load.gif" />'; // show ajax loading image
    }
}
xmlhttp.open("GET", "path/to/file.php", true);
xmlhttp.send();

What I am mainly interested in is how I can retrieve the readyStatea and status and how I can retrieve the response text from within those functions (more or less like this):

$.ajax({url: 'path/to/file.php', async: true, success: function(){
    // how can I get the responseText here?
}, whileLoading: function(){
    // does such a parameter actually exist?
}});

Thanks in advance!


jQuery does not support a "native" (jQuery'ish) access to readyStates.

There is no interactive callback for instance which could represent a readyState===3.

Anyway, you have access to the responseText in the success callback from .ajax()

$.ajax({
   url:      'some.pl',
   dataType: 'text',
   type:     'GET',
   success:  function(data){
      // data represents xhr.responseText here
   }
});

Anyway, the .ajax() method returns the XMLHttpRequest which you can access if necessary.

var myxhr = $.ajax({});
myxhr._onreadystatechange = myxhr.onreadystatechange;

myxhr.onreadystatechange = function(){
    myxhr._onreadystatechange();
    if(myxhr.readyState === 3) {}  // or whatever
};

This is a possible workaround of that issue. But in general you will have all data and information you need within the ajax event callbacks.
Furthermore is the XMLHttpRequest object passed into a lot of callbacks, like beforeSend, error and success.

See http://api.jquery.com/jQuery.ajax/ for further details.


To answer your first question, success callback function takes few parameters, one of them is returned data, so:

$.ajax({url: 'path/to/file.php', async: true, success: function(data){
    // data
}, whileLoading: function(){
    // there is no whileLoading callback function
}});

To answer your second question, there is no such callback function whileLoading. See the documentation for more info: http://api.jquery.com/jQuery.ajax/


$.ajax() returns the XmlHttpRequest it generates, so you can access it that way, for example:

var xhr = $.ajax({url: 'path/to/file.php', async: true, success: function(data){
    // use data here for the response
}});
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4 && xhr.status == 200) {
    $('#statusDisplay').html(xhr.responseText);
  } else if (xhr.readyState >= 1 && xhr.status == 200) {
    $('#statusDisplay').html('<img src="ajax_load.gif" />');
  }
};

That what you probably want is beforeSend and the data (fist parameter) in success, like this:

$.ajax({
  url: 'path/to/file.php', 
  beforeSend: function() { 
    $('#statusDisplay').html('<img src="ajax_load.gif" />');
  },
  success: function(data) {
    $('#statusDisplay').html(data);
  }
});


As of jQuery 1.5, $.ajax() returns a jqXHR object.

This means that:

No onreadystatechange mechanism is provided, however, since success, error, complete and statusCode cover all conceivable requirements

and jAndy's solution will on longer work.

I know of no way to access the XMLHttpRequest object from jqXHR. So if you are looking to respond to changes in the course of a request, and you are using jQuery 1.5, it looks like you had best rely on jqXHR's methods.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜