Se all’utente presentate un campo di input libero, per esempio per ricercare una qualsiasi parola da trovare nel sito, può essere comodo e utile dargli la possibilità di visualizzare in tempo reale i possibili risultati di ricerca. Questi appariranno in un elenco simile al menu a tendina e cambieranno con il digitare di una nuova lettera da parte dell’utente.
JQuery ci mette a disposizione una funzione apposita.
Nell’articolo vedremo innanzitutto un esempio di base, in puro html e javascript, con una serie di parole chiave predefinite tra le quali ricercare. Subito dopo daremo un’occhiata a come costruire una chiamata alle tabelle del database, in modo da ricercare le parole nei campi voluti. L’interfaccia grafica è personalizzabile semplicemente modificando le classi del foglio di stile.
In fondo all’articolo trovate i link di riferimento al sito originale, da cui potete scaricare lo script e visualizzare tutte le opzioni disponibili.
Una nota: lo script ha bisogno del caricamento dei dati all’apertura della pagina. Questo significa che se estraete un grande quantitativo di dati dal database, potreste trovarvi con una pagina pesante e un sito rallentato. Da usare con cautela.
Download script
Le inclusioni e il codice di base
Per funzionare, il codice ha bisogno di tre file da includere, che trovate già compresi nello script da scaricare:
– jquery.js
: richiama le librerie base di JQuery
– jquery-ui.min.js
: inclusioni delle funzioni per l’autocompletamento
– jquery-ui.css
: formattazione del menu a tendina che appare mentre trova i risultati in tempo reale
Il codice di questi tre file sono disponibili online ai seguenti indirizzi e possono essere inclusi altrimenti in questo modo:
1 2 3 |
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script> |
Io consiglio comunque di scaricarli e di averli sempre in locale, perché in caso di (raro) malfunzionamento online o di dismissione del supporto per l’autocompletamento avrete sempre e comunque a disposizione la versione originale.
Analizziamo il file index.html
, che contiene il codice di base.
Il nostro campo di input avrà un identificatore chiamato “autocomplete”, grazie al quale la funzione in JQuery potrà poi agire:
1 |
<input id="autocomplete" />
|
Infine, diamo un’occhiata alla funzione vera e propria, che sarà avviata per qualsiasi input con id="autocomplete"
:
1 2 3 4 5 6 |
$(document).ready(function() { $("input#autocomplete").autocomplete({ source: ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby"], minLength:2 }); }); |
Source
racchiude nell’array l’elenco delle parole entro cui ricercare. Nel momento in cui si inizierà a digitare una lettera presenta almeno in una delle parole nell’array, sarà aperto un menu a tendina con l’elenco dei risultati possibili.
Nell’esempio, ho imposto l’inizio della cerca a quando l’utente ha digitato almeno due caratteri (minLenght: 2
). Altre opzioni da inserire nella funzione sono disponibili nei link a fondo articolo, tra cui la possibilità di ritardare la ricerca o di posizionare i risultati a piacere.
Ricerca dei termini tra i dati di un database
Se volessimo compiere una ricerca tra i dati estratti da una tabella del database, non avremo grosse difficoltà a modificare il codice. La sola parte da cambiare è l’elenco dei termini contenuti nell’array.
All’interno dello script troverete tre file per lo scopo:
– index.php
: contiene il codice vero e proprio
– config.inc.php
: contiene i parametri di connessione al database, che dovrete modificare in modo opportuno
– dump.sql
: il dump da importare nel vostro database, che creerà la tabella “elenco” con già inserita una lista di colori con cui fare il test.
Il nostro codice sarà identico al precedente, eccetto per la sezione riguardante l’inserimento dei dati nell’array:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$(document).ready(function() { $("input#autocomplete").autocomplete({ source: [<?php $stringa=""; $result=mysql_query("select * from elenco", $db); while($row=mysql_fetch_array($result)){ $stringa.="\"".$row['nome']."\", "; } $stringa=substr($stringa,0,-2); echo $stringa ?>], minLength:2 }); }); |
La documentazione completa sulla funzione di autocompletamento, opzioni comprese
vecchiotto script ma funziona anche con:
io ho modificato anche la query di selezione
$result=mysql_query(“select * from elenco”, $db);
con
$result=mysql_query(“select distinct nome from elenco”, $db);
in questo modo elimino eventuali termini doppi…
grazie.
ciao
Grazie per l’aggiunta, Nico
ciao Manuel,
è possibile modificare il css? Tipo dimensione della tendina, bordi ecc e magari colorare lo sfondo per ogni risultato alternando solo 2 colori. esempio: risutato1 (sfondo celeste) – risultato2 (sfondo bianco) – risutato3 (sfondo celeste) ecc
Non trovo nulla in internet.
Grazie in anticipo
Antonio
Ciao Antonio,
puoi agire sul jquery-ui.css e modificare le classi che ti interessano. Meglio se crei un foglio di stile a parte per sovrascriverlo, così eviti di intaccarlo in caso di errori…
grazie Manuel….il problema è che non riesco a trovare le classi che mi interessando….
Il css del jquery-ui.css è suddiviso in sezioni, commentate. Tra le varie c’è la parte per il menu e quella per il button, su cui puoi agire.
Parti da qua. Naturalmente se ti servono modifiche particolari ti serve un po’ di competenza, può essere che non ti basti modificare le classi css presenti ma che debba crearne di nuove
Grande Manuel,
sono giorni che giro su internet alla ricerca di un autocomplete mysql che funzioni senza richiamare un file esterno.
Trovato infine il tuo che mi ha risollevato il morale a 1000000!!!!!!!!!
Grazie mille!
Mi sorto un quesito:
per evitare di interrogare ulteriormente il database non sarebbe possibile esportare anche l’id di riferimento della stringa ricercata?
Ancora grazie!
Ciao Tony, contento che ti sia utile 🙂
più che l’id (che non ti serve stamparlo nell’elenco, a meno che tu non voglia fare una ricerca anche tra gli id) la query sarebbe più efficiente estrando soltanto il campo “nome”. Vedi il commento di Antonio più sopra, che tra le altre cose evita il recupero di doppioni:
$query = “select distinct nome from elenco”;
Ciao,
sì, non mi serve stamparlo. Però ne ho bisogno.
Sicuramente sarà più efficiente così com’è. Ma se comunque io dovrò di nuovo interrogare il database per ricercare il nome inserito con l’input ed estrarrne il suo id, mi chiedo, non ci metto più tempo?
Se ho capito bene quello che ti serve è salvarti da qualche parte l’id legato al prodotto che l’utente sceglie nella ricerca, giusto?
La query mysql estrae tutto l’elenco dei prodotti: così com’è non puoi estrarre soltanto l’id del “nome digitato”, semplicemente perché è una lista completa.
Per fare quello che dici bisogna modificare lo script, ma qua entriamo in un altro argomento più complicato 🙂
Salve a tutti.
io vorrei un consiglio su come fare un autocomplete con dati prelevati da database mysql.
Mi serve per un form di upload.
L’utente scrive, escono le varie opzioni ma se non c’è quella desiderata, può salvare il contenuto che sta scrivendo.
Mi serve per evitare che vengano salvati sul DB dati uguali.
Non riesco a trovare nulla sul web. Perchè tutti gli autocomplete impongono una scelta tra quelle date.
GRAZIE MILLE
Antonio