Una delle grandi potenzialità di jQuery è gestire comodamente chiamate asincrone Ajax/JSON, funzionalità che, nonostante sia sempre più utilizzata, prima di jQuery (o di altre librerie Javascript) era molto “ingombrante”.
Da Wikipedia:
AJAX, acronimo di Asynchronous JavaScript and XML, è una tecnica di sviluppo per la realizzazione di applicazioni web interattive (Rich Internet Application). 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.
La descrizione di tale concetto può risultare difficile da comprendere, in realtà il passaggio più delicato è capire come lavora una chiamata asincrona.
Vediamo in un immagine il comportamento di una chiamata asincrona:
Lo scambio asincrono di dati (nel nostro caso tra HTML e XML) è illustrato in modo semplice nell’immagine, dalla nostra pagina HTML tramite una funzione Javascript (o jQuery) effettueremo una chiamata ad un file XML con la finalità di ottenere alcuni dati presenti in esso; al termine di questa chiamata sempre tramite Javascript avremo tali dati su una variabile da noi definita, a quel punto non ci resta che integrarli nell’HTML tramite il DOM.
Innazitutto è necessario un file XML (per chi non conoscesse tale linguaggio può farsi un idea su Wikipedia) dove saranno contenuti i dati che andremo ad aggiungere alla nostra tendina (facendo riferimento al tutorial “Popolare un menu a tendina con jQuery“). Sfruttiamo Wikipedia e utilizziamo il foglio XML in esempio:
<?xml version="1.0" encoding="UTF-8"?> <utenti> <utente> <nome>Luca</nome> <cognome>Cicci</cognome> <indirizzo>Milano</indirizzo> </utente> <utente> <nome>Max</nome> <cognome>Rossi</cognome> <indirizzo>Roma</indirizzo> </utente> </utenti>
Una volta a disposizione il nostro file prendiamo la pagina in cui andremo a posizionare la nostra chiamata AJAX e aggiungiamo jQuery nel tag head:
<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.2.min.js"></script> <script type="text/javascript"> $(document).ready(function() { //Codice jQuery }); </script>
Assicuriamoci di avere all’interno del body la nostra select con id utenti senza alcuna option e creiamo la chiamata AJAX tramite l’omonima funzione .ajax().
$.ajax({ url: 'dati.xml', dataType: 'xml', success: function(data) { alert(data); }, error: function() { alert('Errore: File XML non trovato'); } });
Analizziamo i parametri della funzione che abbiamo utilizzato:
url : E’ l’indirizzo della pagina dove reperire i dati, in questo caso il nostro dati.xml.
dataType : Definisce il tipo di file su cui sono presenti i dati, le chiamate asincrone infatti si possono effettuare con l’XML ma anche con JSON oppure con del semplicissimo testo.
success : In questo parametro si definire “cosa fare” in caso di successo.
error : In questo parametro invece si definire “cosa fare” in caso di errore.
Possiamo testare il funzionamento, aprendo la nostra pagina ci apparirà una finestra dove ci segnalerà l’errore nel caso di una URL sbagliata del file dati.xml oppure ci segnalerà la presenza di un Object nella variabile data in caso di successo.
Sarà proprio la variabile data che andremo a manipolare con il DOM per popolare dinamicamente la nostra tendina:
$.ajax({ url: 'dati.xml', dataType: 'xml', success: function(data) { $(data).find('utente').each(function(){ nome = $(this).find('nome').text(); cognome = $(this).find('cognome').text(); $('#utenti').append('' + nome + ' ' + cognome + ''); }); }, error: function() { alert('Errore: File XML non trovato'); } });
Esaminiamo cosa succede quando la chiamata va a buon fine: la prima operazione è un mix di due funzioni jQuery, .find() e .each(). Se per .each() sappiamo quale sia il funzionamento (nel caso contrario andate a rivedere il tutorial su Popolare dinamicamente un tendina in jQuery) la funzione .find() invece ci è sconosciuta, cosa fa?
Semplicemente cerca un riscontro (nel nostro caso “utente”) in una struttura ad albero (come potrebbe essere una matrice o in questo caso un file XML) partendo dal padre (nel nostro caso la variabile data che contiene i dati del nostro XML). Associata alla funzione .each() permette di “ciclare” soltanto alcuni elementi figlio in modo da filtrare i nodi che non ci interessano.
Una volta nel ciclo la riutilizziamo per scaricare su due variabili (nome e cognome) il contenuto dei tag XML nome e cognome. A questo punto avremo due variabili (nome e cognome) che potremo andare ad inserire nella nostra tendina con la funzione .append() associata all’id utenti.
In questo tutorial avete tutto il necessario per cominciare a sperimentare con Ajax, i passaggi fondamentali sono:
Comporre una tendina è soltanto una delle tante funzionalità che permette Ajax, si possono moltissime altre cose cambiando la sorgente di dati o il meccanismo di gestione dei dati ottenuti.
Tutto il contenuto di questo breve tutorial è scaricabile cliccando
Download
Salve, vorrei prendere spunto dal tutorial per risolvere un problema che da un pò di tempo mi assilla e che ti descrivo:
ho una pagina php che simula il registro del docente. All’inizio, dopo controlli e istruzioni sql, determino la o le materie di insegnamento e le sue classi. Fin qui tutto bene, viene visualizzato l’elenco della classe e una griglia dove vengono riportati i provvedimenti per ogni studente in base al giorno del mese, come valutazioni, ritardi, assenze, impreparato, ecc. Il problema inizia quando si seleziona il mese di riferimento, il giorno e le ore di lezioni da tre distinte select. A questo punto il refresh della pagina mi azzera e variabili che mi servono per eseguire un’istruzione sql che vada ad inserire o aggiornare la tabella del database.
Ho provato con tre distinte chiamate ajax (non ho tanta esperienza in merito) ma non mi funziona.
Per favore, potresti aiutarmi?
Grazie in anticipo
Ciao Tegatti, è un pò difficile identificare il problema.
Mi è parso di capire che il tuo stia nel gestire le date con tendine differenziate per giorno, mese e anno, in questo caso il problema è l’associazione all’evento. Mi spiego meglio, prima di far partire la chiamata ajax è importante che tutte le tendine siano selezionate, questo può avvenire effettuando un controllo sui tre valori prima di effettuare la chiamata. In alternativa puoi utilizzare un pulsante per effettuare l’inserimento della data (però il controllo dei valori è comunque necessario).
In ogni caso hai parlato di refresh della pagina, attenzione a non confondere la chiamata asincrona (ajax) con il classico refresh.