Sintesi
AJAX
AJAX è un acronimo che sta per Asynchronous JavaScript and XML.
Lo sviluppo di applicazioni HTML con AJAX si basa su uno scambio di dati in background fra web browser e server, che consente l'aggiornamento dinamico di una pagina web senza esplicito ricaricamento da parte dell'utente.
AJAX è asincrono nel senso che i dati extra sono richiesti al server e caricati in background senza interferire con il comportamento della pagina esistente.
Tuttavia, e a dispetto del nome, l'uso di XML non è obbligatorio e, come vedremo, le richieste di caricamento possono essere sia sincrone che asincrone, anche se il meccanismo asincrono è di gran lunga il più utilizzato.

XMLHttpRequest
Per gestire le richieste AJAX Javascript ha un oggetto dedicato: XMLHttpRequest
.
L'oggetto serve a gestire il caricamento di dati dal server via ajax. Questi i tipici passi per effettuare una richiesta:
// 1. Creo l'oggetto XMLHttpRequest
var req = new XMLHttpRequest();
// 2. Creo un gestore per l'evento load
req.addEventListener('load', function() {
// Se non ci sono errori cambio il contenuto HTML della div con id change
if (this.status < 400) {
document.getElementById('change').innerHTML = this.responseText;
} else {
// Altrimenti provoco un errore javascrit
throw(this.statusText);
}
});
// 3. Apro la connessione
req.open('get','contenuto.txt');
// 4. Invio la richiesta
req.send();
Metodi di XMLHttpRequest()
Metodo
|
Descrizione
|
new XMLHttpRequest()
|
Crea un Nuovo XMLHttpRequest object
|
abort()
|
Cancella la richiesta corrente
|
getAllResponseHeaders()
|
Ritorna informazione sull'header della risposta
|
getResponseHeader()
|
Ritorna informazione sull'header della risposta
|
open(method, url, async, user, psw)
|
Apre la connessione specificando la configurazione della richiesta
method: GET o POST
url: l'url da richiedere
async: true (asincrono) o false (sincrono)
user: username (in caso sia previsto login)
psw: password (in caso sia previsto login)
|
send()
|
Manda la richiesta al server (Metodo GET)
|
send(string)
|
Manda la richiesta al server (Metodo POST)
|
setRequestHeader()
|
Aggiunge informazioni all'header della richiesta
|
onreadystatechange
|
Definisce una funzione da chiamare quando la proprietà readyState cambia
|
readyState
|
Stato di XMLHttpRequest.
0: richiesta non inizializzata;
1: connessione server stabilito;
2: richiesta ricevuta;
3: richiesta in elaborazione
4: richiesta completata e la risposta è pronta
|
responseText
|
Dati ricevuti
|
responseXML
|
Dati ricevuti come XML
|
status
|
Restituisce lo stato della richiesta: 200: "OK"; >= 400: Errore (spiegato da statusText)
|
statusText
|
Restituisce il testo corrispondente a status (es.. "OK" o "Not Found")
|
AJAX e jQuery
jQuery fornisce diversi metodi per la funzionalità AJAX.
Con i metodi di jQuery Ajax, è possibile richiedere testo, HTML, XML o JSON da un server remoto utilizzando sia http GET che http POST ed è possibile caricare i dati esterni direttamente negli elementi HTML selezionati.
Scrivere codice AJAX in Javascript nativo può essere un po' complicato, perché i browser implementano AJAX in maniera leggermente differente. I metodi jQuery, invece, assicurano compatibilità del codice per i browser previsti dalla versioni della libreria usata.
.load()
$(selector).load(url,data,callback);
Il metodo load() carica i dati da un server http(s) e inserisce i dati restituiti nell'elemento selezionato.
- Il parametro
url
(obbligatorio) specifica l'url che si desidera caricare.
- Il parametro facoltativo
data
specifica i parametri da inviare al server insieme alla richiesta ed è un oggetto Javascript o una stringa in formato QueryString.
- Il parametro facoltativo
callback
è una funzione da eseguire dopo il completamento del caricamento.
$("#div1").load("demo_test.txt");
È anche possibile aggiungere un selettore jQuery al parametro URL.
Nell'esempio seguente viene caricato il contenuto dell'elemento con id = "div-test", all'interno del file "demo_test. txt", in div#div1.
$("#div1").load("demo_test.txt #div-test");
Il parametro callback
(facoltativo) specifica una funzione da eseguire quando il metodo load() viene completato. La funzione viene invocata con tre argomenti:
responseTxt
: contiene, se la chiamata ha esito positivo, il contenuto caricato
statusTxt
: contiene lo stato della chiamata
XHR
: contiene l'oggetto XMLHttpRequest
$("button").click(function(){
$("#div1").load("demo_test.txt", function(responseTxt, statusTxt, xhr){
if(statusTxt == "success")
alert("External content loaded successfully!");
if(statusTxt == "error")
alert("Error: " + xhr.status + ": " + xhr.statusText);
});
});
$.axax()
$.ajax({parametri})
{parametri}
è un plainObject Javascript che specifica una o più coppie nome/valore che configurano la richiesta AJAX.
Di norma non è necessario utilizzare direttamente $.ajax()
. jQuery offre numerose alternative che internamente usano $.ajax()
, ma sono in grado di offrire un interfaccia più semplice e rapida per risolvere le esigenze più comuni.
Nelle tabelle che seguono i parametri di configurazione accettati.
Sono evidenziati i parametri deprecati.
parametro
|
descrizione
|
async
|
Valore booleano che indica se la richiesta è asincrona. Valore predefinito è true
|
beforeSend(xhr)
|
Una funzione da eseguire prima che la richiesta venga inviata
|
cache
|
Valore booleano che indica se il browser deve memorizzare nella cache i contenuti delle richieste. Valore predefinito è true
|
complete(xhr,status)
|
Una funzione da eseguire quando la richiesta è terminata
|
contentType
|
Tipo di contenuto utilizzato per l'invio dei dati al server. Il valore predefinito è: "Application/x-www-form-urlencoded"
|
context
|
Specifica il valore this per tutte le funzioni di callback correlate a Ajax
|
data
|
Specifica i parametri da inviare al server
|
dataFilter(data,type)
|
Una funzione utilizzata per gestire i dati di risposta non elaborati del XMLHttpRequest
|
dataType
|
Tipo di dati previsto dalla risposta del server.
|
error(xhr,status,error)
|
Una funzione da eseguire se la richiesta ha esito negativo.
|
global
|
Valore booleano che specifica se attivare o meno gli handle dell'evento Ajax globale per la richiesta. Valore predefinito è true
|
ifModified
|
Valore booleano che specifica se una richiesta ha esito positivo solo se la risposta è stata modificata dopo l'ultima richiesta. Il valore predefinito è: false.
|
jsonp
|
Una stringa che esegue l'override della funzione di callback in una richiesta JSONP
|
jsonpCallback
|
Specifica un nome per la funzione di callback in una richiesta JSONP
|
password
|
Specifica una password da utilizzare in una richiesta di autenticazione di accesso HTTP.
|
processData
|
Valore booleano che specifica se i dati inviati con la richiesta devono essere trasformati in una stringa di query. Valore predefinito è true
|
scriptCharset
|
Specifica il set di caratteri per la richiesta
|
success(result,status,xhr)
|
Una funzione da eseguire quando la richiesta ha esito positivo
|
timeout
|
Timeout locale (in millisecondi) per la richiesta
|
traditional
|
Un valore booleano che specifica se utilizzare o meno lo stile tradizionale di serializzazione param
|
type
|
Specifica il tipo di richiesta. (Get o post)
|
url
|
Specifica l'URL a cui inviare la richiesta. L'impostazione predefinita è la pagina corrente
|
username
|
Specifica un nome utente da utilizzare in una richiesta di autenticazione di accesso http
|
xhr
|
Una funzione utilizzata per creare l'oggetto XMLHttpRequest
|
Tutti i metodi ajax di jQuery restituiscono un oggetto jqXHR che contiene tutte le informazioni sull'oggetto Javascript XMLHttpRequest originale con cui è stata gestita la richiesta. Inoltre l'oggetto jqXHR offre tre metodi per impostare tre diverse funzione di callback su ogni singola richiesta. I metodi disponibili dell'oggetto jqXHR sono:
jqXHR.done(function(data, textStatus, jqXHR) {});
La funzione passata come parametro viene richiamata quando la richiesta è andata a buon fine senza errori.
jqXHR.fail(function(jqXHR, textStatus, errorThrown) {});
Il metodo .fail() sostituisce il metodo deprecato .error(). La funzione passata come parametro viene eseguita quando la richiesta fallisce.
jqXHR.always(function (data | jqXHR, textStatus, jqXHR | errorThrown) {});
Il metodo .always() sostituisce il metodo deprecato .complete(). La funzione passata come parametro viene eseguita sempre.
var jqxhr = $.ajax( "example.php" )
.done(function() {
alert( "success" );
})
.fail(function() {
alert( "error" );
})
.always(function() {
alert( "complete" );
});
$.get()
$.get(url [, data ] [, success ] [, dataType ])
Carica i dati dal server utilizzando una richiesta HTTP GET. Restituisce un oggetto jqXHR.
url
Tipo: string
Stringa contenente l'URL a cui viene inviata la richiesta.
data
Tipo: PlainObject o string
Un oggetto semplice o una stringa che viene inviata con la richiesta contente i parametri da inviare al server.
success
Tipo: function(PlainObject, textStatus, jqXHR)
Una funzione di callback che viene eseguita se la richiesta ha esito positivo.
datatype
Tipo: string
Il tipo di dati previsto dal server. (XML, JSON, script, text, HTML).
$.post()
$.post(url [, data ] [, success ] [, dataType ])
Carica i dati dal server utilizzando una richiesta HTTP POST. Restituisce un oggetto jqXHR.
url
Tipo: string
Stringa contenente l'URL a cui viene inviata la richiesta.
data
Tipo: PlainObject o string
Un oggetto semplice o una stringa che viene inviata con la richiesta contente i parametri da inviare al server.
success
Tipo: function(PlainObject, textStatus, jqXHR)
Una funzione di callback che viene eseguita se la richiesta ha esito positivo.
datatype
Tipo: string
Il tipo di dati previsto dal server. (XML, JSON, script, text, HTML).
$.getJSON()
$.getJSON(url [, data ] [, success ])
Carica i dati dal server in formato JSON utilizzando una richiesta HTTP GET. Restituisce un oggetto jqXHR.
url
Tipo: string
Stringa contenente l'URL a cui viene inviata la richiesta.
data
Tipo: PlainObject o string
Un oggetto semplice o una stringa che viene inviata con la richiesta contente i parametri da inviare al server.
success
Tipo: function(PlainObject, textStatus, jqXHR)
Una funzione di callback che viene eseguita se la richiesta ha esito positivo.
$.getScript()
$.getScript(url [, success ])
Carica uno script dal server utilizzando una richiesta HTTP GET e lo esegue. Restituisce un oggetto jqXHR.
url
Tipo: string
Stringa contenente l'URL a cui viene inviata la richiesta.
success
Tipo: function(PlainObject, textStatus, jqXHR)
Una funzione di callback che viene eseguita se la richiesta ha esito positivo.
JSON
Quando si scambiano dati tra un browser e un server, i dati possono essere solo in formato testo.
JSON è un formato testo in cui può essere convertito qualsiasi oggetto JavaScript, che, in questo modo, può essere inviato al server. Allo stesso modo possiamo convertire qualsiasi JSON ricevuto dal server in un oggetto JavaScript.
Con questo sistema possiamo scambiare informazioni tra client e server utilizzando il formato che Javascript predilige e che ci semplifica molto l'elaborazione: l'oggetto.
Utilizzando JSON posso:
- Convertire un oggetto Javascript in stringa e inviarlo al server come parametro di un url.
- Convertire una stringa JSON ottenuta come risposta dal server in un oggetto per elaborarlo con Javascript
- Memorizzare sul computer dell'utente un oggetto costruito run-time dalla pagina web utilizzando localStorage.
La sintassi JSON è derivata dalla sintassi di notazione degli oggetti JavaScript:
- I dati sono coppie nome / valore
- I dati sono separati da virgole
- Le parentesi graffe identificano gli oggetti
- Le parentesi quadre identificano gli array
- Le coppie nome/valore seguono questa sintassi:
"nome":"Pippo"
con il nome della proprietà sempre fra virgolette doppie
In JSON, i valori devono appartenere a uno dei seguenti tipi di dati:
- String
- Number
- Object (oggetto JSON)
- Array
- Boolean
- null
JASON non è in grado di rappresentare i seguenti tipi:
In JSON, i valori delle stringhe devono essere scritti con doppie virgolette.
Metodi JSON
// Converte l'oggetto javascriptObject in una stringa JSON
JSON.stringify(javascriptObject);
// Converte stringa JSONString in un oggetto Javascipt
JSON.parse(JSONString);