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.
精彩评论