This chapter covers
- A brief overview of Ajax
- Loading preformatted HTML from the server
- Making GET and POST requests
- Exerting fine-grained control over requests
- Setting default Ajax properties
- Handling Ajax events
10.1 Brushing up on Ajax
10.1.1 Creating an XHR instance
var xhr;
if (window.ActiveXObject) {
xhr = new ActiveXObject ('Microsoft.XMLHTTP');
} else if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else {
throw new Error('Ajax is not supported by this browser')
}
XMLHttpRequest (XHR) methods and properties
| Method | Description |
|---|---|
| abort() | |
| getAllResponseHeaders() | |
| getResponseHeader(name) | |
| open(method, url[, async[, username[, password]]]) | |
| overrideMimeType(mime) | |
| send([content]) | |
| setRequestHeader(name, value) | |
| onreadystatechange | |
| readyState | |
| response | |
| responseText | |
| responseType | |
| responseXML | |
| status | |
| statusText | |
| timeout | |
| ontimeout | |
| upload | |
| withCredentials |
10.1.2 Initiating the request
- Specify the HTTP method (such as POST or GET).
- Provide the URL of the server-side resource to be contacted.
- Let the XHR instance konw how it can inform you of its progress.
- Provide any body content for requests such as POST.
xhr.open('GET', '/some/resource/url');
xhr.send('a=1&b=2&c=3');
10.1.3 Keeping track of progress
xhr.onreadystatechange = function() {
if (this.readyState === 4) {
if (this.status >= 200 && this.status < 300) {
// Success
} else {
// Problem
}
}
}
10.1.4 Getting the response
- Instanitiating an XHR object requires browser-specific code.
- Ready handlers need to sift through a lot of uninteresting state changes.
- The response body needs to be dealt with in numerous ways, depending on its format.
10.2 Loading content into elements
var xhr;
if (window.ActiveXObject) {
xhr = new ActiveXObject('Microsoft.XMLHTTP');
} else if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else {
throw new Error('Ajax is not supported by this browser');
}
xhr.onreadystatechange = function() {
if (this.readyState === 4) {
if (this.status >= 200 && this.status < 300) {
document.getElementById('elem').innerHTML = this.responseText;
}
}
}
xhr.open('GET', 'some-resource');
xhr.send();
10.2.1 Loading content with jQuery
load(url[, data][, callback])
Parameters
url (String)
data (String|Object|Array)
callback (Function)
Returns
The jQuery collection.
var updates = 1;
function pollInfo() {
$('#container').load('/check-updates', function(responseText, textStatus, jqXHR) {
if(textStatus === 'success') {
$('#status-update').text('Data updated. Update #' + updates);
updates++;
}
setTimeout(pollInfo, 1000);
});
}
pollInfo();
serialize()
Parameters
none
Returns
The formatted query string.
serializeArray()
Parameters
none
Returns
The array of form data.
10.2.2 Loading dynamic HTML fragments
$('#boot-chooser-control').change(function(event) {
$('#product-detail-pane').load(
'actions/fetch-product-details.php',
{
model: $(event.target).val()
},
function() {
$('[value=""]', event.target).remove();
}
);
});
$('#boot-chooser-control')
.load('actions/fetch-boot-style-options.php')
.change(function(event) {
$('#product-detail-pane').load(
'actions/fetch-product-details.php',
{
model: $(event.target).val()
},
function() {
$('[value=""]', event.target).remove();
}
);
});
10.3 Making GET and POST requests
10.3.1 Getting data with GET
$.get(url[, data][, callback][, dataType])
Parameters
url (String)
data (String|Object)
callback (Function)
dataType (String)
Returns
The jqXHR instance.
$('#boot-chooser-control')
.change(function(event) {
$.get(
'actions/fetch-product-details.php',
{
model: $(event.target).val()
},
function(response) {
$('#product-detail-pane').html(response);
$('[value=""]', event.target).remove();
}
);
});
10.3.2 Getting JSON data
$.getJSON(url [, data][, callback])
Returns
The jqXHR instance
10.3.3 Dynamically loading script
$.getScript(url[, callback])
Returns
The jqXHR instance.
getScript: function(url, callback) {
return jQuery.get(url, undefined, callback, "script");
}
$('#load-button').click(function() {
$.getScript('external.js');
});
$('#inspect-button').click(function() {
someFunction(someVariable);
});
10.3.4 Making POST requests
$.post(url[, data][, callback][, dataType])
Returns
The jqXHR instance
10.3.5 Implementing cascading dropdowns
$bootChooser.change(function() {
$('#product-detail-pane').load(
'actions/fetch-product-details.php',
$(this).serialize()
);
// More to follow
});
$bootChooser.change(function() {
$('#product-detail-pane').load(
'actions/fetch-product-details.php',
$(this).serialize()
);
// More to follow
});
$colorChooser.change(function() {
$sizeChooser.load(
'actions/fetch-size-options.php',
$colorChooser
.add($bootChooser)
.serialize(),
function() {
$(this).prop('disabled', false);
}
);
});
10.4 Taking full control of an Ajax request
10.4.1 Making Ajax requests with all the trimmings
$.ajax(url[, options])
$.ajax([options])
Parameters
url (String)
options (Object)
Returns
The jqXHR instance.
Options for the $.ajax() utility function
| Name | Description |
|---|---|
| url | |
| method | |
| data | |
| dataType | |
| cache | |
| context | |
| timeout | |
| global | |
| contentType | |
| success | |
| error | |
| complete | |
| beforeSend | |
| async | |
| processData | |
| contents | |
| converters | |
| crossDomain | |
| headers | |
| dataFilter | |
| ifModified | |
| isLocal | |
| jsonp | |
| jsonpCallback | |
| username | |
| password | |
| scriptCharset | |
| statusCode | |
| xhr | |
| xhrFields | |
| accepts | |
| mimeType | |
| traditional |
10.4.2 Setting request defaults
$.ajaxSetup(options)
Parameters
options (Object)
Returns
undefined
$.ajaxSetup({
type: 'POST',
timeout: 5000,
dataType: 'html'
});
10.4.3 Handling Ajax events
jQuery Ajax event types
| Event name | Type | Description |
|---|---|---|
| ajaxStart | Global | |
| beforeSend | Local | |
| ajaxSend | Global | |
| success | Local | |
| ajaxSuccess | Global | |
| error | Local | |
| ajaxError | Global | |
| complete | Local | |
| ajaxComplete | Global | |
| ajaxStop | Global |
ajaxComplete(callback)
ajaxError(callback)
ajaxSend(callback)
ajaxStart(callback)
ajaxStop(callback)
ajaxSuccess(callback)
Parameters
callback (Function)
Returns
The jQuery collection.
var $log = $('#log');
$(document).on(
'ajaxStart ajaxStop ajaxSend ajaxSuccess ajaxError ajaxComplete',
function(event) {
$log.text($log.text() + event.type + '\n');
}
);
10.4.4 Advanced Ajax utility functions
$.ajaxPrefilter([dataTypes,] callback)
Parameters
dataTypes (String)
callback (Function)
Returns
undefined
$.ajaxPrefilter('xml', function(options, originalOptions, jqXHR) {
if ($.inArray(options.url, originalOptions.deniedDomains) !== -1) {
console.log('Ajax request to ' + options.url + ' aborted');
jqXHR.abort();
} else {
console.log('Ajax request performed');
}
});
$.ajax(
'http://www.google.com',
{
dataType: 'xml',
deniedDomains: [
'http://www.google.com',
'http://www.manning.com'
]
}
);
$.ajaxTransport([dataType], callback)
Parameters
dataType (String)
callback (Function)
Returns
undefined
10.5 Summary
load()
$.get()
$.getJSON()
$.post()
$.ajax()
$.ajaxSetup()
ajaxStart()
ajaxSend()
ajaxSuccess()
ajaxError()
ajaxComplete()
ajaxStop()