Blog

Search by tag: ajax

Mi capita sempre + spesso di parlare di AJAX e descriverlo come “facile da programmare” a persone che ancora non si sono avvicinate alla programmazione web avanzata. E’ ovvio che in questo caso non riesco ad essere molto credibile! :)
Quindi ecco qui una ppppiiiiccola guida passo passo per comprendere cosa veramente ci permette di fare questa nuova tecnologia. Credo che per leggere tutto senza fatica serva un minimo di conoscenza della programmazione web… o una bella fantasia! :P
Ah, per realizzare il tutto è necessario avere installati sulla propria macchina, o anche su una macchina remota, un server HTTP (io uso Apache 2.2) funzionante con PHP ed un server MySQL. Tutto open source naturalmente… basta scaricare ed installare! ;)

AJAX (Asynchronous Javascript and XML)… tutto si basa sul concetto di “comunicazione asincrona” con il server: noi clicchiamo su un link o un pulsante per eseguire un’azione su dei dati remoti (che possono essere righe di database, file sul disco del server, ecc…) e ne vediamo subito le conseguenze, ancor prima che le azioni siano comunicate al server.
Quindi, mentre noi andiamo avanti a navigare e a fare altro, un javascript si occupa (con molta tranquillità) di comunicare al server l’azione che abbiamo eseguito “virtualmente”… sicchè il server capisce il da farsi ed esegue di fatto le azioni.
Il vantaggio? E’ stato eliminato il tempo di latenza della comunicazione client-server ed anche il reload della pagina! :)

Inoltre, sempre grazie ad AJAX, possiamo cambiare radicalmente il contenuto di una pagina web (tramite manipolazione DOM), richiedendo dati al server in formato XML o testo semplice, e sempre senza ricaricare la pagina… che per siti abbastanza complessi è una vera seccatura!

Andiamo al lato pratico della questione: il fondamento di AJAX è un oggetto javascript che si chiama XMLHttpRequest.
A causa delle differenti implementazioni sui diversi browser, questo oggetto viene creato tramite una funzione cross-browser che si scrive una volta e poi si può dimenticare tranquillamente. :)

function createXMLHttpRequest() {
	try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
	try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
	try { return new XMLHttpRequest(); } catch(e) {}
	alert("XMLHttpRequest not supported");
	return null;
}

Quindi abbiamo capito che questa funzione restituisce il giusto oggetto per le chiamate AJAX, a seconda del browser. Cominciamo mettendola dentro un file di testo e chiamiamolo ajax.js.

Adesso dobbiamo decidere cosa fargli fare. Uhm… facciamo finta di avere una tabella in HTML con tante righe prese dal database sul server… e vogliamo che alla pressione di un pulsantino accanto alla riga, questa venga cancellata dalla pagina e anche dal DB.
Ovviamente la cancellazione “visuale” avverrà subito tramite manipolazione DOM e la cancellazione “reale” avverrà con i suoi tempi tramite una chiamata AJAX.

La parte che ci interessa della pagina HTML, cioè la tabella, potrebbe essere generata da un semplice script PHP, che non riporto. Nell’esempio successivo infatti realizzeremo questo passo in AJAX.

Ma andiamo alla nostra tabella. Nella pagina HTML, in mezzo a tutto il resto, avremo qualcosa del genere:

<html>
<head>
	<title>Test AJAX 1</title>
	<script type="text/javascript" src="ajax.js"></script>
</head>
<body>
<table id="tabella">
	<tr id="riga_1">
		 <!-- QUESTO E' IL DATO PROVENIENTE DAL DB... -->
		<td>Testo 1</td>
		 <!-- ...E QUESTO E' IL PULSANTINO DI ELIMINAZIONE -->
		<td><input type="button" value="Elimina" onclick="elimina_riga(1)" /></td>
	</tr>
	<tr id="riga_2"> <!-- ALTRE RIGHE PER RENDERE LA COSA UN PO' VEROSIMILE -->
		<td>Testo 2</td>
		<td><input type="button" value="Elimina" onclick="elimina_riga(2)" /></td>
	</tr>
	<tr id="riga_3">
		<td>Testo 3</td>
		<td><input type="button" value="Elimina" onclick="elimina_riga(3)" /></td>
	</tr>
</table>
</body>
</html>

… e la funzione Javascript (dentro il file ajax.js) che svolgerà l’azione sarà più o meno così:

function elimina_riga(id) {
	
	// LA RIGA VIENE CANCELLATA DALLA PAGINA WEB
	riga = document.getElementById("riga_"+id);
	riga.parentNode.removeChild(riga); 
	
	// E ADESSO CANCELLIAMOLA _VERAMENTE_ DAL DB
	var xhReq = createXMLHttpRequest();
	xhReq.open("POST", "elimina_riga.php", true);
	xhReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	xhReq.onreadystatechange = function() {
		if (xhReq.readyState == 4)  {
			if(xhReq.status == 200) {
				// PER SICUREZZA CONTROLLIAMO CHE L'AZIONE SIA ANDATA A BUON FINE
				if(xhReq.responseText!="1") {
					alert("Hey, qualcosa è andato storto!");
				}
			}
		}
	}
	xhReq.send("id="+id);
}

Sul server ci sarà uno script elimina_riga.php che esegue l’azione asincrona sul database. Per completezza:

<?php
if(is_numeric($_POST['id'])) { // EVITIAMO ATTACCHI DI SQL INJECTION

	mysql_connect('localhost', 'username', 'password'); // CONNESSIONE AL DB
	mysql_select_db('database');

	if(mysql_query("DELETE FROM tabella WHERE id=".$_POST['id']))
		echo "1"; // ET VOILA'... RIGA CANCELLATA!
	else
		echo "0";
}
?>

Ho omesso tutti i controlli su un’eventuale autenticazione (che si potrebbe fare molto facilmente con le variabili di sessione del PHP), perchè è un argomento che non riguarda questo tutorial.

Beh… a questo punto il primo passettino con AJAX è stato fatto! :)
Adesso possiamo vedere qualcosa di più complicato… la richiesta di dati in formato XML!

L’XML è utile per organizzare i dati in una struttura ad albero schematica e allo stesso tempo flessibile dal punto di vista del programmatore.

Supponiamo di voler creare la tabella HTML dell’esempio precedente, utilizzando i dati presi dal database: la tabella sarà creata al carimento della pagina tramite una XMLHttpRequest e la manipolazione DOM del documento.

La pagina HTML dovrà associare all’evento di caricamento della pagina la funzione javascript per la creazione della tabella:

<html>
<head>
	<title>Test AJAX 2</title>
	<script type="text/javascript" src="ajax.js"></script>
</head>
<body onload="popola_tabella()">

<table id="tabella">
</table>

</body>
</html>

leggi_tabella.php è uno script PHP lato server che produce il file XML che ci serve per popolare la nostra tabella:

<?php
header("Content-Type: text/xml");
echo "<?xml version="1.0" encoding="ISO-8859-15" standalone="yes"?>\n";

mysql_connect('localhost', 'username', 'password'); // CONNESSIONE AL DB
mysql_select_db('database');

?>
<tabella>

<?php
$query = mysql_query("SELECT id, testo FROM tabella");
while($riga = mysql_fetch_assoc($query)) {
?>
	<riga id="<?=$riga['id']?>"><?=$riga['testo']?></riga>
<?
}
?>

</tabella>

Il risultato che avremo sarà come questo:

<?xml version="1.0" encoding="ISO-8859-15" standalone="yes"?>
<tabella>
	<riga id="1">Testo 1</riga>
	<riga id="2">Testo 2</riga>
	<riga id="3">Testo 3</riga>
</tabella>

e servirà una funzione javascript per richiedere la pagina XML al server ed interpretarla per farla diventare codice HTML.

Dentro ajax.js avremo la funzione principale:

function popola_tabella() {
	var xhReq = createXMLHttpRequest();
	xhReq.open("POST", "leggi_tabella.php", true);
	xhReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	xhReq.onreadystatechange = function() {
		if (xhReq.readyState == 4)  {
			if(xhReq.status == 200) {
				xml = xhReq.responseXML;
				if(xml!=null) {
					// INDIVIDUA L'ELEMENTO tabella NELLA PAGINA HTML
					tabella = document.getElementById("tabella"); 
					// ELEMENTO tabella NEL FILE XML
					var xmlTabella = xml.getElementsByTagName("tabella")[0];
					// TUTTE LE RIGHE DELLA TABELLA NEL FILE XML 
					var xmlRighe = xmlTabella.getElementsByTagName("riga");  

					for(i=0;i<xmlRighe.length;i++) { // PER OGNI RIGA....
						xmlRiga = xmlRighe<i>;

						// LEGGE L'ID DELLA RIGA
						id = xmlRiga.getAttribute("id");

						// LEGGE IL TESTO CONTENUTO
						testo = xmlRiga.childNodes[0].nodeValue;

						// CREA UNA NUOVA RIGA
						riga = document.createElement("tr");

						// IMPOSTA L'ID
						riga.setAttribute("id","riga_"+id);

						// CREA LA CELLA CON IL TESTO
						cella1 = document.createElement("td");      
						cella1.innerHTML = testo;

						// CREA LA CELLA CON IL PULSANTE ELIMINA
						cella2 = document.createElement("td");       

						// CREA IL PULSANTE ELIMINA
						elimina = document.createElement("input");  
						elimina.setAttribute("type","button");
						elimina.setAttribute("value","Elimina");
						elimina.onclick = function() { elimina_riga(id); };

						// AGGIUNGE IL PULSANTE ELIMINA ALLA CELLA
						cella2.appendChild(elimina);

						// AGGIUNGE LE CELLE ALLA RIGA
						riga.appendChild(cella1);
						riga.appendChild(cella2);

						// AGGIUNGE LA RIGA ALLA TABELLA
						tabella.appenChild(riga);
					}
						
				}
			}
		}
	}
	xhReq.send("");	
}

E’ da notare che il codice che viene scritto dopo xhReq.onreadystatechange = function() { è da trattare come una funzione separata, che viene invocata quando la virtual machine rileva un cambiamento dello stato della XMLHttpRequest. Ciò implica che non potremo accedere da questo codice alle variabili utilizzate all’interno della funzione chiamante.

… direi che abbiamo finito! :lol:

Bene! :) Adesso chi volesse approfondire potrebbe utilizzare questi piccoli esempi come base per costruire qualcosa di più complesso. Vi assicuro che quanto c’è di più difficile nella programmazione AJAX è stato trattato in questo tutorialino-ino-ino! ;)

Maggiori informazioni sulle funzioni per la manipolazione DOM le potete trovare facilmente su Google.

Sperando di essere stato utile a qualcuno… vi auguro buona programmazione! :D


July 27, 2006 19:05 - 3 comments

AJAX ha un problema. Ci sto riflettendo in questi giorni.
Il problema è che sì, è tutto + veloce e immediato e non si deve ricaricare la pagina per cambiarne i contenuti, MA… questi contenuti non possono essere indicizzati dai motori di ricerca!
E’ un problema che voglio risolvere, nel migliore dei modi possibili!

Rifletto mentre scrivo.. scrivo mentre rifletto… come si fa a far vedere al motore di ricerca una parte di pagina web che in realtà non è presente nel codice della pagina? E’ soltanto il prodotto di un Javascript… tutto dinamico!
Prima del web 2.0 era semplice, perchè tutti i contenuti stavano regolarmente nella pagina, ma la appesantivano e c’era sempre l’annoso problema del reload… il motore di ricerca passava e prendeva atto di quello che stava scritto nella pagina. Ma adesso? Vedrà solamente lo scheletro della pagina!!!

Caspita che problema!

Un contenuto deve essere accessibile univocamente tramite un URL. Peccato, mi piaceva tanto l’idea di non sporcare la barra dell’indirizzo! Ma è inevitabile, perchè un ipotetico Google dovrà sapere che all’URL http://bruno.infopa.net/?blog=1 è scritto il post numero 1 del blog. Attualmente non è proprio così… cioè c’è un’abbozzo di questa idea, che utilizza il timestamp della data dei post. Non esattamente comodissimo! :-/
Inoltre i post raggiunti attraverso il “link diretto” non dovranno essere caricati con tecnologia AJAX, ma tramite una comunissima inclusione PHP. In questo modo il codice del post sarà all’interno dell’HTML vero e proprio della pagina.
Dovrebbe essere come avere due modalità di accesso al sito, trasparenti al visitatore:

1) Accesso alla home page → Modalità AJAX → Navigazione all’interno del sito tramite AJAX

2) Accesso tramite link diretto → Modalità “vecchia” → Lettura del post corrispondente al link diretto → Click su un link di navigazione → Modalità AJAX

E’ semplice da realizzare? Uhm… direi di sì: basta fare mezzo passo indietro e ripristinare la funzionalità di caricamento del post “old style” soltanto quando viene utilizzato un link diretto. Ah… rimane anche l’implementazione dei link diretti in maniera decente.

Dimenticavo: a questo punto il calendario non basta + per la navigazione tra i post! Ci potrebbero essere problemi quando ci sono più post nello stesso giorno, perchè il calendario non utilizza l’id del post, ma il timestamp. Credo che per risolvere questo problema inserirò una serie di pulsantini avanti/indietro.

Al lavoro! Che la sfida abbia inizio!

PS: probabilmente qualcuno ha già affrontato questa problematica e quindi io presto scoprirò l’acqua calda. Machissenefreeeega!

PPS: prima devo capire un po’ se lo spazio attuale (in pixel^2) risulti un po’ troppo angusto o meno…..


Google Web Toolkit – Build AJAX apps in the Java language

… così si presenta la nuova idea della “grande G”.

E’ un insieme di librerie che permettono lo sviluppo in via semplificata di applicazioni AJAX anche per chi è all’asciutto di programmazione. Partendo dal Java, si possono utilizzare le classi fornite da Google per poi generare il Javascript necessario a dinamicizzare l’interfaccia web di qualsiasi sito.
Per applicazioni AJAX si intende qualcosa di simile a GMail, Google Calendar, eccetera..

Scelta poco condivisibile, da parte mia, perchè sono sempre stato contro la fornitura di “pappa pronta”. Si corre il rischio di fornire uno strumento molto potente anche a chi non lo sa utilizzare, annullando così la professionalità di chi quelle cose le ha studiate per bene; stessa cosa che successe molto tempo fa con la nascita degli editor WYSIWYG per le pagine web.

Beh.. ecco il link:

Beh.. ecco il link:

http://code.google.com/webtoolkit

… sperando che possa servire da “antipasto” per approfondire seriamente le tecnologie del Web 2.0 :)


March 31, 2006 20:20 - 2 comments

Nello scorso post parlavo di un possibile cambiamento del sito nel prossimo futuro, per adeguarlo al 100% alle specifiche AJAX (Asynchronous JavaScript and XML). Infatti avevo utilizzato PHP, HTML, CSS, Javascript, ma non l’XML e le richieste asincrone.
Bene… il prossimo futuro era più prossimo di quanto pensavo, perchè da questo momento sto sfruttando al massimo la potenza di AJAX!!! :D

Ho modificato il blog in modo da prendere le informazioni tramite delle richieste XML/HTTP: in questo modo ho eliminato completamente i tempi di attesa causati dal reload della pagina… e la navigazione all’interno del blog diventa praticamente istantanea!!
Sono troppo contento di esserci riuscito così velocemente, perchè da adesso in poi voglio utilizzare questa tecnologia in tutti i miei progetti!

Da oggi mi sento un fautore del Web 2.0!!


March 30, 2006 04:04 - No comments yet

Sono quasi le 2 di notte e ho appena finito di dare una “rinfrescata” al mio sitarello.
Per gli utilizzatori di Firefox cambierà poco… soltanto qualche accorgimento grafico. La novità è che ho reso il sito inter-operabile con Internet Explorer .
Non che me ne importasse + di tanto, ma da quando lavoro in azienda ho imparato quanto è importante soddisfare le esigenze di tutti… e quale miglior modo per sperimentare, se non quello di fare un po’ di danno in casa propria?? :D Beh, invece a quanto pare funziona ancora tutto!

L’idea non mi è venuta dal nulla, anzi devo ringraziare Smashkins che mi ha fatto scattare la scintilla, parlandomi delle tecnologie AJAX.
Sì, AJAX: Asynchronous JavaScript and XML.. il Web 2.0!! :D
Senza saperlo, nella vecchia versione del sito avevo già implementato delle funzioni che si ritrovano adesso nelle nuove tecnologie internettiane (finestre a comparsa, icone spostabili, eccetera)… solo che adesso so come si chiamano e ho potuto documentarmi meglio! _
Sono ancora lontano dall’utilizzo vero e proprio dell’XML… credo che il feed RSS non sia il massimo che si può ricavare da questa tecnologia. Chissà… appena avrò qualche minuto potrei anche dedicare qualche neurone proprio a questo argomento. :)

PS: un paio di giorni fa ho utilizzato 5 minuti liberi per implementare la funzione di ricerca nel blog… il campo di ricerca è sotto il calendario.