Ajax - le basi di questa meravigliosa tecnica 


Ajax ( Asynchronous JavaScript and XML ) è una tecnica di sviluppo web che ha lo scopo di proporre interattivà senza tuttavia dover ricaricare la pagina ad ogni interazione con l’utente. In sostanza, Ajax permette attività in backgroud rispetto ad eventi principali: un esempio tipico di utilizzo di questa tecnica è l’aggiornamento dinamico di elenchi, per esempio utilizzato ultimamente nei social networks. Mentre l’utente può scorrere le notizie e qundi interagire con la pagina, l’elenco delle news inserite si autoaggiorna senza tuttavia dover attedere che sia l’utente stesso ad effettuare l’aggiornamento della pagina.

Questa tecnica ha ormai aperto le porte a nuove tipologie di applicazioni, sempre più interattive e sempre più accattivanti. Ma come funziona Ajax? Ecco un esempio passo-passo di utilizzo di queste tecnologie: i commenti si possono leggere direttamente sul codice, in modo da facilitare la comprensione e velocizzare l’apprendimento. Supponiamo che questo codice sia contenuto in un file
ajax1.js” :

/*
Questa è la funzione principale di creazione: si crea la variabile obj che conterrà il riferimento all’oggetto XMLHttpRequest l’oggetto principale su cui si agisce. Per garantire la compatibilità viene eseguito un controllo sul tipo di browser, visto che a seconda della tipologia l’oggetto obj viene creato in modi diversi. Se il browser è “non - Internet Explorer”, allora si utilizza la funzione XMLHttpRequest altrimenti se il browser è Internet Explorer si utilizza ActiveXObject(”Microsoft.XMLHTTP”). Questa differenza ha una base teorica, che non trattiamo in questa sede, occupandoci qui di “pura pratica”. Se volete approfondimenti scriveteci, e provvederemo ad esaudire le vostre richieste! ;)

*/
function createXHR() {
var obj;
if (window.XMLHttpRequest) { // Non Internet Explorer
obj = new XMLHttpRequest();
} else if (window.ActiveXObject) { // Internet Explorer
obj = new ActiveXObject(”Microsoft.XMLHTTP”);
}
return obj;
}

obj=createXHR();

/*Questa è la funzione che gestisce e analizza lo stato dell’applicazione: si procede innanzittutto con dei controlli, che possiamo fare analizzando lo stato dell’oggetto obj precedentemente istanziato. Se durante il cambiamento si stato dell’oggetto obj non si sono verificati errori, allora le funzioni readyState e status ritorneranno rispettivamente i valori 4 e 200, valori che indicano appunto l’avvenuto caricamento con successo. A questo punto possiamo scrivere il codice che deve eseguire l’appilcazione per raggiungere il suo obiettivo. Nel nostro caso, una volta ricevuta la richiesta, la nostra piccola applicazione Ajax provvedrà a creare una select caricando il contenuto dinamicamente, cioè una select che cambia le opzioni in base ad una scelta fatta dall’utente ma senza il bisogno di ricaricare l’intera pagina.
*/
function onStateChange() { // Cambiamento Stato
if (obj.readyState == 4) { // Caricamento Avvenuto
if (obj.status == 200) { // con successo

var div = document.getElementById(’risultato’);
if ( document.uniqueID ) {
var select = document.createElement(”<select id=’district’ name=’district’ ></select>”);
} else {
var select = document.createElement(”select”);
}
select.setAttribute(”name”,”district”);
select.setAttribute(”id”,”district”);
select.setAttribute(”onchange”,”invia2();”);

list = new Array();
list1 = new Array();
list2 = new Array();

/*IMPORTANTE: tramite la proprietà responseText dell’oggetto obj è possibile recuperare valori prodotti dal file che si occupa di gestire la richiesta al server, per esempio il file che effettua una query e che nel nostro caso è xmlHttpRequest.php*/
string = obj.responseText;

list = string.split(”;”);
list1 = list[0].split(”\n”);
list2 = list[1].split(”\n”);

for ( i=0; i < list1.length; i++ ) {
op = new Option(list2[i], list1[i]);
select.options[i] = op;
}
document.getElementById(”risultato”).innerHTML=”";
div.appendChild(select);

} else {
document.getElementById(”risultato”).innerHTML=”?”;
alert(”Errore: “+obj.statusText);
}
}

}

/*La funzione invia() è quella da cui inizia l’attività: infatti questa funzione non fa altro che inviare alla funzione inviaXHR() il riferimento all’oggetto obj e il link del file di gestione
*/
function invia() {

inviaXHR(obj,”http://link_pagina/xmlHttpRequest.php”);
}

/*Questo è il cuore dell’applicazione: attraverso una richiesta POST, inviamo con la funzione send() i dati al file xmlHttpRequest.php, che potrà svolgere il suo compito indipendentemente dalle altre interazioni che l’utente potrà avere con la pagina. Nel nostro caso, supponiamo che in questo file ci sia il codice per effettuare una query al database, e che con i risultati ottenuti si crei l’insieme delle opzioni che andranno a “riempire” la select di cui sopra. Supponiamo di aver creato una stringa in cui ogni attributo value dell’opzione è separato dal valore visibile dal carattere “|”, cioè:

value|Valore visibile ->>> <option value=’value’>Valore visibile</option>

*/
function inviaXHR(obj,url) {
try {
// Preparazione comunicazione
obj.open(”POST”, url, true);

// caricamento in corso…fornisce il feedback all’utente
document.getElementById(”risultato”).innerHTML=”caricamento in corso…”;
obj.setRequestHeader(’Content-Type’, ‘application/x-www-form-urlencoded’);

//richiamiamo la funzione onStateChange analizzata precedentemente
obj.onreadystatechange = onStateChange;

/*IMPORTANTE: a seconda del valore country possiamo gestire la select
che vogliamo creare, e quindi possiamo aggiornarla in base a determinati valori che vengono assegnati a country
*/
country=escape(document.myform.country.value);

//Inviamo al file di gestione .php alcuni parametri, attraverso il metodo POST
obj.send(”country=”+country); // Trasferimento

} catch (e) {

/*
Se si verificano problemi, l’elemento HTML che doveva diventare una select verrà sostituiro con un ?, che indica appunto il verificarsi di errori o problemi
*/
document.getElementById(”risultato”).innerHTML=”?”;
alert(”Errore: “+e);
}

}

Per chi avesse le idee ancora confuse, riassumiamo brevemente ciò che succede.

  1. Creaimo l’oggetto obj.
  2. Supponiamo di cliccare su un pulsante che richiama la funzione javascript “invia()”; attiviamo così una richiesta al server.
  3. Tramite la funzione inviaXHR gestiamo effettivamente la richiesta: il metodo utiliaazto è il POST (con cui possiamo inviare dati al file di gestione) e il file di gestione è xmlHttpRequest.php, che nel nostro caso è scritto in PHP ma che potrebbe essere scritto in un qualsiasi linguaggio di programmazione. La funzione send() ci permette di inviare parametri al file di gestione, parametri che vengono inviati attraverso il metodo POST, appunto.
  4. Il file di gestione può fare qualsiasi cosa per svolgere il suo compito: supponiamo nel nostro caso che il file effettui una query al database e restituisca una stringa.
  5. Viene richiamata la gestione di stato dell’oggetto, onStateChange, che analizza l’andamento della richiesta che abbiamo effettuato. Se tutto è andato bene, recuperiamo attraverso la proprietà responseText dell’oggetto obj la stringa prodotta dal file di gestione. Possiamo lavorare sulla stringa restituita, creando ad esempio una select con delle option che dipendono dal valore di un parametro scelto dall’utente, nel nostro caso country.

Tutto questo lavoro viene svolto in background, senza che l’utente di accorga di nulla, ma soprattutto permettendo all’utente di continuare ad interagire con la pagina liberamente e come se nulla stia accadendo.

Vota Articolo:
Articoli Correlati
Linux - Editor VI: i comandi principali per utilizzare al meglio questo editor
JAVASCRIPT - Cambiare una classe di stile CSS dinamicamente
JAVA - Gestire, Lanciare, Creare eseguibili Java
JQuery - Effetti grafici spettacolari per i vostri siti web
Joomla SEO - Come migliorare l’indicizzazione dei propri siti Joomla

8 Commenti a “Ajax - le basi di questa meravigliosa tecnica”

  1. admin scrive:

    Sì, è un articolo molto conosciuto, comunque in effetti ciò che importa sono le riflessioni dell’autore!

    Aspettiamo allora che i lavori inizino…se hai bisogno di qualcosa, sai che ci siamo! ;)

    A presto

  2. Knight scrive:

    Ti ringrazio molto, avevo già visto quel link, ma non è proprio la stessa cosa che avevo in mente io, ma ho trovato utilissime le riflessioni dell’autore. Appena troverò il tempo necessario inizierò a buttare giù il codice e vedrò cosa salta fuori. Per ogni dubbio non esiterò a contattarti e a lavoro finito (si spera) non esiterò a condividere il mio codice se può interessare.

    Tanti saluti :-)

  3. admin scrive:

    Eccoci! Ho capito che tipo di sistema intendi implementare, anche se senza dettagli ovviamente è difficile sbilanciarsi.

    Ad ogni modo mi sembra di capire che con ajax hai iniziato da poco: allora ecco il consiglio. Ajax è una tecnica veramente straordinaria, ma è molto importante esserne padroni e capirne dettagliatamente le caratteristiche, perchè può risultare anche molto pericolosa per quanto riguarda la sicurezza.

    Se hai ancora qualche dubbio su tale tecnica, medita bene se è il caso di utilizzarla proprio per un sistema di login: a volte, soprattutto per chi è all’inizio, si tralasciano dettagli che con Ajax diventano “pozzi senza fondo” (basta pensare al cosidetto problema del pulsante “Indietro” dei browser).

    Se invece ti senti sicuro, magari prova a darmi qualche indicazione in più sui problemi che hai riscontrato…così li vediamo insieme! ;)

    Ecco un link che se non hai già visto ti potrà essere molto utile:

    http://www.jamesdam.com/ajax_login/login.html

    Fai bene attenzione ai problemi che l’autore ha riscontrato! :P

  4. Knight scrive:

    colgo allora l’occasione per illustrarti quello che ho in mente di creare, ossia un sistema di login basato su ajax e php, neanche troppo complicato, ma d’impatto proprio nella sua semplicità.

    I classici campi user e pass, una volta che l’utente ha cliccato un invia, parte l’effetto fade e un loader grafico classico dell caricamento, se è andato tutto a buon fine appare, sempre con effetto fade in entrata, il messaggio che dice “Benvenuto utente” dove utente è un link al suo profilo, mentre se qualcosa è andato male ritornano i campi di login e il messaggio di errore…

    Qualche dritta? Per la parte php non ci sono problemi, è il lato ajax che mi frega :-)

    Saluti

  5. admin scrive:

    Sono contento che l’esempio ti sia stato utile!!

    Lo scopo di questo progetto è proprio quello di discutere sulle tecniche di programmazione e trovare soluzioni originali, efficienti e migliorarsi sempre…

    Se hai un problema da affrontare o un approfondimento da proporre, non esistare a scriverci: sicuramente, compatibilmente con i tempi redazionali, faremo in modo di darti una risposta!! ;)

  6. Knight scrive:

    Grazie mille sei stato davvero gentilissimo. Tengo sott’occhio questo blog in attesa di nuove chicche e intanto cerco di darmi da fare con l’interazione fra ajax e php.

    Nuovamente grazie per la demo che mi è stata utilissima per capire i miei errori

  7. admin scrive:

    Gentile Knigh, abbiamo provveduto a creare un esempio che dovrebbe chiarire l’utilizzo della tecnica presentata in questo articolo: l’esempio è visibile al seguente indirizzo

    http://www.marcolecce.com/blog/Esempi/esempio2/

    provvisto di commenti per facilitarne la comprensione.

    Ovviamente è un esempio che mostra solamente una piccolissima parte del potenziale di Ajax, ma in fondo ciò che importa è capirne il meccanismo…una volta fatta nostra la teoria che sta alla base di questa tecnica, ne diventiamo padroni!! ;)

  8. Knight scrive:

    Non si potrebbe vedere un demo ?

    Comunque lo trovo un articolo molto utile per chi come me si avvicina ad ajax cercando di farlo interagire con php

Scrivi un commento

Inserisci Emoticon

  • :em04:
  • :em01:
  • :em28:
  • :em08:
  • :em66:
  • :em57:
  • :em52:
  • :em30:
  • :em22:
  • :em50:
  • :em49:
  • :em61:
  • :em14:
  • :em63:
  • :em24:
  • :em64:
  • :em54:
  • :em55:
  • :em41:
  • :em67:
  • :em62:
  • :em51:
  • :em34:
  • :em12:
  • :em32:
  • :em18:
  • :em21:
  • :em17:
  • :em56:
  • :em48:
  • :em38:
  • :em44:
  • :em58:
  • :em47:
  • :em15:
  • :em40:
  • :em27:
  • :em60:
  • :em03:
  • :em29:
  • :em72:
  • :em53:
  • :em02:
  • :em46:
  • :em65:
  • :em71:
  • :em35:
  • :em37:
  • :em11:
  • :em69:
  • :em68:
  • :em23:
  • :em13:
  • :em05:
  • :em45:
  • :em09:
  • :em36:
  • :em25:
  • :em43:
  • :em59:
  • :em39:
  • :em31:
  • :em06:
  • :em10:
  • :em16:
  • :em20:
  • :em33:
  • :em07:
  • :em26:
  • :em42:
  • :em70:
  • :em19: