Creare un textbox con autocompletamento
La diffusione delle tecniche tipiche del Web 2.0 ha permesso agli sviluppatori di costruire interfacce contemporaneamente semplici ed efficaci migliorando l’esperienza utente anche sotto l’aspetto della fruizione dei contenuti. A chiunque è capitato almeno una volta di imbattersi in un textbox “intelligente”, capace di suggerire dei termini in base ad alcuni caratteri digitati. Un esempio su tutti è quello di Google Suggest http://www.google.com/webhp?complete=1&hl=en. Una casella di testo di questo tipo, oltre a velocizzare le operazioni, permette di evitare inutili ricerche prive di risultati interessanti, in altre parole consente di realizzare esperienze interattive intuitive ed appaganti. Nel seguente articolo mostrerò come creare un textbox con autocompletamento in Javascript, in particolare con l’ausilio della libreria jQuery http://jquery.com/. Il risultato finale è riportato nello screenshot: (Immagine 1)
Innanzitutto è importante fissare i passaggi chiave dell’applicazione:
- Intercettazione dei caratteri digitati dall’utente.
- Richiesta asincrona al server e relativa risposta in formato XML.
- Costruzione della lista dei suggerimenti.
- Gestione dell’interazione utente con tale lista.
È necessario premettere che lo script fa uso di una pagina lato server (.NET nello specifico) che, opportunamente interrogata, restituisce una lista di suggerimenti in formato XML. Tale pagina non sarà oggetto di studio in questa trattazione, ci limiteremo a prendere in considerazione la struttura del file restituito, che è la seguente:
<items> <item>Andorra</item> <item>Angola</item> <item>Anguilla</item> <item>Antarctica</item> <item>Antigua and Barbuda</item> </items>
A questo punto possiamo cominciare e la prima operazione consiste nel creare una pagina XHTML contente gli elementi necessari:
<input id=”q” type=”text” /> <div id=”suggest” />
Il primo è il campo di testo in cui l’utente digiterà i caratteri desiderati e il secondo è un generico elemento in cui andremo ad inserire la lista dei suggerimenti ottenuta dal server. Successivamente è necessario creare una classe CSS così composta:
div#suggest ul li.selected { background-color:#ccc; }
Essa definisce lo stile di uno degli elementi di maggior rilievo di questo articolo. La classe selected ha, infatti, il compito di identificare, se esiste, l’elemento selezionato nella lista dei suggerimenti. Naturalmente lo stile può essere adattato al layout della vostra web application, nello specifico ho utilizzato uno sfondo grigio. È giunto il momento di passare in rassegna le principali funzioni Javascript sulle quali ci appoggeremo:
function select(element) { if (element.is(“li”)) { $(“li.selected”, “#suggest”).removeClass(“selected”); element.addClass(“selected”); } } function setText() { $(“#q”).val($(“li.selected”, “#suggest”).text()); clear(); } function clear() { $(“#suggest”).empty(); $(“#suggest”).hide(); } function cancelEvent(e) { if (!e) { e = window.event; } if (e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; } }
La funzione select ci permette di assegnare ad un elemento (in particolare ad un "
$(function() { $(“#q”).attr(“autocomplete”, “off”); clear();
Al caricamento della pagina aggiungiamo l’attributo autocomplete, impostato su off, al textbox. Esso evita che appaiano i suggerimenti di default previsti dai browser più diffusi. Applicare l’attributo fuori dal markup ci permette di garantire la funzionalità predefinita a quegli utenti che non possiedono un browser in grado di interpretare codice Javascript e non possono quindi usufruire della nostra funzione di autocompletamento.
$(“#q”).keydown( function(e) { var selected; var input = $(this); if ($(“*”).index($(“li.selected”, “#suggest”)[0]) >= 0) { selected = $(“li.selected”, “#suggest”); } else { selected = null; }
Successivamente ci mettiamo in ascolto sull’evento keydown della casella di testo e settiamo una variabile contenente il riferimento all’elemento con classe selected presente nella lista oppure null, in caso la lista sia nascosta o nessun elemento selezionato.
switch(e.keyCode) { case 13: cancelEvent(e); if (selected) { setText(); } break;
A questo punto vediamo come gestire le varie possibilità di interazione utente con il textbox e la lista.
Alla pressione del tasto con codice 13 (enter), se un elemento ha classe selected, scriviamo il suo contenuto direttamente nella casella di testo.
case 38: cancelEvent(e); if (selected) { select(selected.prev()); } break; case 40: cancelEvent(e); if (selected) { select(selected.next()); } else { $(“li”, “#suggest”).eq(0).addClass(“selected”); } break;
I tasti con codice 38 e 40 sono rispettivamente “freccia sù” e “freccia giù”.
Alla pressione di detti tasti spostiamo la classe selected sull’elemento precedente o successivo nella lista dei suggerimenti.
Nota bene: se alla pressione della “freccia giù” nessun elemento è selezionato applichiamo la classe selected al primo.
default: timeout = setTimeout(function() { if (input.val().length >= 1) { $(“#suggest”).show(); $(“#suggest”).html(“<img src=’images/ajax-loader.gif’ alt=’’ />”); $.get(“data.aspx?q=” + input.val(), function(data) { $(“#suggest”).html(“<ul>”); $(“item”, data).each(function(i) { var li = document.createElement(“li”); $(li).html($(this).text()); $(“ul”, “#suggest”).append(li); $(li).mouseover(function() { select($(this)); }); $(li).click(function() { setText(); }); }); }); } else { clear(); } }, 300); break; } }); });
Quest’ultimo caso della struttura ci permette di intercettare la pressione di tutti gli altri tasti. Innanzitutto è necessario impostare un timeout che ci dia la possibilità di posticipare l’utilizzo dei dati in modo tale da non perdere alcun carattere. A questo punto mostriamo un’immagine (tipicamente una gif animata) che pone l’utente in fase di attesa mentre interroghiamo il server. Sulla callback della richiesta facciamo il parsing dell’XML generando la lista dei suggerimenti alla quale associamo i gestori degli eventi del mouse.
Rispettivamente: mouseover (imposta la classe selected sull’elemento) e click (scrive nella casella di testo il valore dell’elemento di classe selected della lista dei suggerimenti). Non vi resta che assemblare il tutto e proporre un textbox con autocompletamento nelle vostre applicazioni.

