Proseguiamo l'esempio mettendo in piedi lo script per generare la richiesta asincrona. Oltre al solito file utility.js
il client dovrà avere a disposizione un altro file, chiamato all'occorrenza leggiGoogleNews.js
, che contiene la funzione leggiGoogleNews()
per offrire questo servizio.
Listato 30. Chiamata asincrona alle news di Google
// scegliere il nome del file server da utilizzare
// leggiNews.php oppure leggiNews.aspx
var serverSide = 'PHP/leggiNews.php';
function leggiGoogleNews(idPaese, idSubmit, idRisultato) {
// variabili di funzione
var
// select contenente alcuni paesi
paeseScelto = prendiElementoDaId(idPaese).value,
// tasto di invio richiesta form
bottoneSubmit = prendiElementoDaId(idSubmit),
// div con id univoco per mostrare il risultato
divRisultato = prendiElementoDaId(idRisultato),
// oggetto ajax
ajax = assegnaXMLHttpRequest();
// se tutti gli elementi appena assegnati sono validi
if(ajax && paeseScelto && bottoneSubmit && divRisultato) {
// evitiamo richieste multiple disabilitando il bottone di submit
bottoneSubmit.disabled = true;
// inizializziamo l'oggetto per la richiesta richiamando il file
// server desiderato ed aggiungendo alla url la querystring
// contenente l'abbreviazione del nome del paese
// riconosciuta da Google
ajax.open("get", serverSide + "?lingua=" + paeseScelto, true);
ajax.setRequestHeader("connection", "close");
// funzione assegnata ad onreadystatechange
ajax.onreadystatechange = function() {
// se le operazioni sono state effettuate
if(ajax.readyState === readyState.COMPLETATO) {
// ... ed il server non ha dato errori
if(statusText[ajax.status] === "OK")
// stampiamo il risultato
divRisultato.innerHTML = parsaXml(ajax.responseXML);
// ... altrimenti mandiamo un avviso
else
divRisultato.innerHTML = "Impossibile effettuare l'operazione richiesta.<br />" + "Errore riscontrato: " + statusText[ajax.status];
// riabiliamo il bottone per permettere un'altra richiesta
bottoneSubmit.disabled = false;
};
};
// invio richiesta
ajax.send(null);
// durante l'attesa si comunica all'utente
// che la pagina sta effettuando l'operazione richiesta
divRisultato.innerHTML = "<img src="immagini/indicatore.gif" width="20" height="21" alt="caricamento dati" />" + " lettura in corso ...";
};
// se qualche elemento manca o il browser non supporta AJAX
// ritorna 'true' per far operare il form come
// se non ci fosse alcun javascript
return !ajax;
};
La funzione parsaXml()
è a grandi linee la stessa usata nell'esempio della request in XML ad eccezione del controllo sull'autore.
Un form per tutti
È fondamentale strutturare il form perchè sia degradabile, qualità indispensabile per permettere a chiunque di utilizzare il servizio proposto.
Listato 31. Form degradabile per lanciare la richiesta
<div>
<form
method="get"
action="http://news.google.it/news"
onsubmit="return leggiGoogleNews('paese', 'visualizza', 'risultato');"
>
<fieldset>
<legend>Di quale paese ti interessano le news ?</legend>
<label for="paese">lingua e paese scelti per le news</label>
<select tabindex="1" id="paese" name="ned">
<!--// ... alcuni paesi selezionabili //-->
<option value="en_ie">Irlanda</option>
<option value="it" selected="selected">Italia</option>
<option value="es_mx">Messico</option>
<!--// altri paesi selezionabili ... //-->
</select>
<label for="visualizza">visualizza il risultato</label>
<input tabindex="2" id="visualizza" type="submit" value="leggi le news" />
</fieldset>
</form>
</div>
<div id="risultato"></div>
Il fulcro della degradabilità è rappresentato dall'evento onsubmit
, il quale verrà ignorato sia dagli utenti che non hanno JavaScript abilitato sia da coloro che non hanno un browser aggiornato. Il valore true
, restituito in questo caso dalla funzione, farà richiedere alla form stessa la pagina http://news.google.it/news con appesa la variabile del paese selezionato.
Lo scopo del servizio è permettere di leggere tali news, e la variabile output=rss
è stata volutamente omessa nell'attributo action
, per evitare che un browser non aggiornato mostri all'utente l'albero RSS, di difficile lettura.
Per concludere con questo esempio, ecco il link al file zip contenente tutto il necessario per testare l'applicativo, il quale dovrà essere lanciato dal file index.html
attraverso il webserver locale in grado di gestire PHP oppure ASP.NET.