- Una semplice chat in AJAX - |
|||
COSA SERVE PER QUESTO TUTORIAL | |||
Download | Chiedi sul FORUM | Glossario | cognizioni generiche sul funzionamento del web | ||
Una chat in AJAX che sfrutta PHP o ASP .Net | |||
STRUTTURA DELLA CHAT Pagine coinvolte e funzionamento della chat AJAX
In questo tutorial vedremo come creare una chat asincrona in AJAX,
facendo uso di linguaggi lato server (PHP o ASP .Net) esclusivamente per
scrivere i dati in un file. Faremo dunque delle periodiche richieste al
server per sapere la dimensione del file contenente il log della chat e
se è aumentata dall'ultimo controllo richiederemo al server solamente la
parte che ci manca.
La pagina principale attraverso la quale si inviano messaggi La pagina main.htm contiene, come detto, un IFRAME che punta a chat_content.htm e varie INPUT, una per specificare il nick, una per il messaggio, una per il colore e in più una SELECT per impostare il linguaggio in uso. Infine vi è un pulsante per inviare un messaggio che richiama la funzione Send() al click da parte dell'utente. <input type="button" value="Invia" onclick="Send()"> Vediamo questa funzione il cui obiettivo è inviare l'autore, il messaggio e il colore al server cosicché possa memorizzarlo. function Send() { // Mettiamo i value dei vari campi in variabili locali var message = document.getElementById("messaggio").value; var author = document.getElementById("autore").value; var colore = document.getElementById("colore").value; var pagina = document.getElementById("lang").value; // Creiamo la richiesta AJAX passando un riferimento alla funzione che // deve gestire il risultato della richiesta xmlHttp = GetXMLHttpRequest(xmlHttp_readystatechange); // Prepariamo la richiesta verso la pagina ASP .Net o PHP con metodo POST // e in modo che sia asincrona (l'ultimo parametro) xmlHttp.open("POST", pagina, true); // Impostiamo il tipo di dati che stiamo per inviare sul formato delle query // che seguono il ? negli URL (es. http://sito/pagina.asp?par1=val1&par2=val2) xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); // Inviamo i dati xmlHttp.send("messaggio=" + message + "&autore=" + author + "&colore=" + colore); }
Come si può facilmente intuire nelle prime righe memorizziamo in
variabili i vari valori dei campi, poi, con una chiamata a GetXMLHttpRequest,
creiamo un nuovo oggetto XMLHttpRequest (il cuore di AJAX), impostando
anche la funzione che deve gestire l'avanzamento della richiesta che
stiamo per fare su xmlHttp_readystatechange (funzione che non fa
null'altro che svuotare la casella del messaggio quando la richiesta è
stata completata). <div><strong>Piero</strong> - <span style="color: red">Messaggio</span></div>LA FINESTRA DELLA CHAT La pagina che si auto-aggiorna con gli ultimi contenuti
Vediamo come ora invece come è stata implementata la pagina che
controlla ogni secondo se sono arrivati nuovi messaggi, ed eventualmente
scarica esclusivamente quelli. Lo script di questa pagina si articola in
due fasi: la prima fase in cui viene effettuata una richiesta HEAD al
server per ottenere la dimensione del file di log (log_chat.cha) e
confrontarla con l'ultima nota e quindi se necessario, passare ad una
seconda fase nella quale si scarica la parte mancante del log tramite
una richiesta GET. // Dimensione del log l'ultima volta che è stato verificato var dimensione=0; // Valore che indica la fase in cui ci troviamo // 1 = verifica della dimensione // 2 = download dei dati mancanti var fase; // Percorso del file di log var path = "log_chat.cha"; // Intervallo tra una verifica e l'altra in millisecondi var checkEvery = 1000; // Funzione che avvia la verifica delle presenza di nuovi dati function GetNewMessages() { fase = 1; // Creiamo la richiesta AJAX xmlHttp = GetXMLHttpRequest(xmlHttp_readystatechange); // Richiesta HEAD: non prende i contenuti ma solo le intestazioni // Il parametro nc serve per evitare che sia restituito un risultato dalla cache xmlHttp.open("HEAD", path + '?nc=' + Date.parse(new Date()), true); // Effettuiamo la richiesta xmlHttp.send(null); }
Nota: al percorso verso cui si effettua la richiesta, come si può vedere,
viene aggiunto un parametro nc contenente la data corrente.
Questo è indispensabile per i browser come FireFox che mantengono una cache
delle richieste. function xmlHttp_readystatechange() { // Al completamento di una richiesta if(xmlHttp.readyState == 4) { switch (fase) { case 1: // Se siamo nella prima fase prendiamo la dimensione del log in remoto // e la confrontiamo con quella a noi nota dimensioneCorrente = xmlHttp.getResponseHeader("Content-Length"); if (dimensioneCorrente > dimensione) { // Se le dimensioni sono aumentate effetuiamo la richiesta dei // dati mancanti fase = 2; // Creiamo la richiesta AJAX xmlHttp = GetXMLHttpRequest(xmlHttp_readystatechange); // Richiesta asincrona verso il log xmlHttp.open("GET", path, true); // Limitiamo i risultati solamente ai byte successivi all'ultimo // che abbiamo già ricevuto xmlHttp.setRequestHeader("Range", "bytes=" + (dimensione) + "-"); // Effettuiamo la richiesta xmlHttp.send(null); // Aggiorniamo la dimensione del log dimensione = dimensioneCorrente; } else { // Impostiamo un timer per ripetere la verifica della dimensione // del log window.setTimeout(GetNewMessages, checkEvery) } break; case 2: // Aggiungiamo in fondo al body i nuovi dati document.body.innerHTML = document.body.innerHTML + xmlHttp.responseText; // Scrolliamo fino alla fine del documento window.scrollTo(0, 9999999999) // Impostiamo un timer per ripetere la verifica della dimensione // del log window.setTimeout(GetNewMessages, checkEvery) } } }
Nota: si ricordi che questa funzione xmlHttp_readystatechange non è la
stessa della pagina main.htm; si tratta di due funzioni totalmente
distinte.
|
|||
<< INDIETRO | by VeNoM00 |