|
- 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 | ||