AJAX (Asynchronous JavaScript and XML) is a technique for creating interactive website user interfaces without the traditional web page refresh or reload. It uses asynchronous data exchange between client and server to update displayed information and respond to user interactions seamlessly. Include additional tags for programming languages, libraries, frameworks, web browsers, protocols and other environmental information.
ajax stands for Asynchronous javascript and xml.
While not a technology in itself, ajax is a term coined in 2005 by Jesse James Garrett, that described an approach to using a number of existing technologies together, including: html / xhtml, css, javascript, the dom, xml, xslt, and most importantly the XMLHttpRequest
object. ajax uses the XMLHttpRequest
(abbreviated xhr) API to manage http requests from inside the code.
What makes ajax so valuable is the asynchronous nature of the data exchange. Before its advent, data was only sent during the client communication phase (when the web page was first requested). This meant that all data had to either be loaded when the page was requested, or the user interaction would be a series of HTML requests to the server with page refreshes. Each HTML request would provide additional information as part of the URL or as data in a form field with state data often kept as hidden field data. This second alternative used a series of GET or POST operations (i.e., load page, change data, post data, load page, etc.), resulting in the displayed page being refreshed, providing a choppy user experience and possible security issues.
Neither loading an entire data set into the client nor reloading the base page with each GET
or POST
request was cheap in terms of resources. ajax changed the web model by using JavaScript to asynchronously load data into the client as the data was needed.
The XMLHttpRequest
object is the primary method of interacting with the server and the client; it is supported by all modern browsers. There are several frameworks and libraries with a higher level API that encapsulate the XMLHttpRequest
object, providing a more straightforward interface to hide the complexity of using the object
directly.
The client opens a new XMLHttpRequest
and requests a web page, just like a regular client call would. This request, however, is typically aimed at a particular page that loads only data to be processed by JavaScript. As such, the data that needs to be exchanged can be limited to just what is necessary for that particular function, saving time, memory and bandwidth. Because it is asynchronous, this interaction does not have to block any other actions being done on the web page, and it lets the client/browser act more like a local desktop program with the website, exchanging data as needed without reloading any other resources.
Although the "X" in ajax stands for xml, any type of data can be sent and received. json (JavaScript Object Notation) has replaced xml as the data interchange format of choice. A major reason for using JSON is that JavaScript natively parses JSON text, while XML must be parsed by a much slower and cumbersome set of client libraries. Today, with the help of new responseType
objects (ArrayBuffer
, Blob
, etc.), you can even request binary files via XMLHttpRequest
and build much stronger and fully-featured web apps.
When XMLHttpRequest
is used directly, the code must handle the communications layer and wait for the request response to be complete. This is shown in the code example below starting with the line if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
. Since this callback function will be called every time the client receives a packet from the server, this test is needed to ensure the request state is complete and a valid 200
response is received before processing the response.
AJAX Example 1:
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) {
//stuff to do with response text (xmlhttp.responseText)
}
}
xmlhttp.open("GET", "url", true);
xmlhttp.send();
AJAX Example 2:
function (url, params) {
// IE 5.5+ and every other browser
var xhr = new(window.XMLHttpRequest || ActiveXObject)('MSXML2.XMLHTTP.3.0');
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
xhr.setRequestHeader("Accept", "application/json");
xhr.onreadystatechange = function () {
if (this.readyState === 4) {
if (this.status >= 200 && this.status < 400) {
console.log(JSON.parse(this.responseText));
}
}
}
xhr.send(params);
xhr = null;
},
Because needing to test the status adds some complexity to ajax, there are many javascript libraries that will handle this interaction for you. Below is an example of using a standard library, jquery and shows how it simplifies ajax
jQuery AJAX Example:
$.ajax({
url: "url",
context: document.body
}).done(function() {
//stuff to do with response text
});
As of Chrome 42, Edge 14 and Firefox 39/52, there is a new API called fetch
that drastically simplifies ajax in browsers. There is no support for Internet Explorer. fetch
is Promised based.
Fetch AJAX example:
fetch('/url')
.then(res => res.json())
.then(jsonData => console.log(jsonData));
fetch('/url', { method: 'POST', body: JSON.stringify({id: 1}), })
.then(res => res.json())
.then(jsonData => console.log(jsonData));
Axios AJAX example:
Axios is a Promise based HTTP client for the browser and Node JS.
// Make a request for a user with a given ID
axios.get('/user?ID=12345')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
axios.post('/user', {
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
List of AJAX frameworks:
- jQuery UI
- MooTools
- Prototype
- YUI Library
- ASP.NET AJAX
- Spry framework
- Dojo Toolkit
- Ext JS
- Backbone.js
- AngularJS
- Unified.JS