Articoli Manifesto Tools Links Canali Libri Contatti ?
Tip / AJAX

Ajax ... before Ajax (3)

Abstract
Un altro semplice Tip pre-Ajax per attuare il retrieving dei dati Server-Side e l'autocompletamento di un field!
Data di stesura: 20/02/2006
Data di pubblicazione: 20/02/2006
Ultima modifica: 04/04/2006
di Stefano Fago Discuti sul forum   Stampa

In questo Tip non utilizzeremo un IFRAME ma sfrutteremo il DOM per la creazione e distruzione di elementi. Dato un text-field, inserendo le lettere vedremo apparire l'elenco degli elementi corrispondenti; da questo elenco click-ando verrà riempito il field con la scelta fatta!
Il ruolo di loader è affidato ad un nodo SCRIPT costruito a runtime grazie a DOM. Viene imposto l'attributo SRC del nuovo nodo in modo da invocare la servlet che produce la tabella di risposta.
Il nodo script necessita di un javascript valido nel riferimento all'attributo SRC: la servlet quindi non produce del semplice HTML ma un vero e proprio script per la gestione dei contenuti!

Testato con Netscape 8, FireFox 1.x, IE 5.5+, Opera 8

Buon Divertimento!

I nostri ingredienti.

<table>
 <form name="selection" action="#" method="post">
  <tr>
   <td><input type="text" name="product" value="" onkeyup="update(this,'panel')"></td>
   <td><div id="panel" style="position:absolute;border:1px solid #000;"/></td>
  </tr>
  <tr>
   <td colspan="2"><input type="submit" name="Submit" value="Submit"><input type="reset" value="Reset"></td>
  </tr>
  </form>
 </table>
  1. function update(subject,target){  
  2.   var url = 'res?id='+escape(subject.name)+'&param='+escape(subject.value)+'&target='+target;  
  3.   var body = document.getElementsByTagName('BODY')[0];  
  4.   var node = document.createElement('SCRIPT');  
  5.   node.setAttribute('id','caller');  
  6.   node.setAttribute('language','JavaScript');  
  7.   node.setAttribute('src',''+url);  
  8.   body.appendChild(node);  
  9.   setTimeout('reset()',1000); 
  10.  }  
  11.  
  12.  
  13. function reset(){  
  14.    var body = document.getElementsByTagName('BODY')[0];  
  15.    var node = document.getElementById('caller'); 
  16.     if(node){ 
  17.        body.removeChild(node); 
  18.  }  
  19.  
  20. function assign(selected){ 
  21.  document.forms['selection'].product.value = selected.innerHTML; 
  22.  return false; 
  1. public class ResponseProducer 
  2.     extends HttpServlet { 
  3.  
  4.   private static String[] products = { 
  5.       "ALTRO NON IN ELENCO", 
  6.       "ACCESSORI IDRAULICI", 
  7.       "AMMORTIZZATORI", 
  8.       "ANTINE", 
  9.       "APPARECCHI DI SICUREZZA", 
  10.       "ARCATA", 
  11.       "ARGANO", 
  12.       "ARGANO GEARLESS", 
  13.       "BARRIERA ELETTRONICA", 
  14.       "BOTTONIERA CABINA", 
  15.       "BOTTONIERA PIANO", 
  16.       "CABINA", 
  17.       "CASTELLETTO", 
  18.       "CATENE DI COMPENSAZIONE", 
  19.       "CAVI FLESSIBILI", 
  20.       "CENTRALINA IDRAULICA", 
  21.       "CITOFONI", 
  22.       "CONTRAPPESI", 
  23.       "CORRIMANO CABINA ASCENSORE", 
  24.       "EMERGENZA", 
  25.       "FOTOCELLULE", 
  26.       "FUNI", 
  27.       "GUIDE", 
  28.       "IMPIANTO A FUNE", 
  29.       "IMPIANTO ANTIDEFLAGRANTE", 
  30.       "IMPIANTO OLEODINAMICO", 
  31.       "IMPIANTO STAGNO", 
  32.       "LAMPADE", 
  33.       "LAMPADE A PROTEZIONE ADPE", 
  34.       "LAMPADE GERMICIDE", 
  35.       "LIMITATORE DI VELOCITA'", 
  36.       "MOTORI C.A.", 
  37.       "MOTORI C.C.", 
  38.       "OPERATORI", 
  39.       "OSCILLATORI", 
  40.       "PATTINI CABINA", 
  41.       "PATTINI CABINA", 
  42.       "PATTINO RETRATTILE", 
  43.       "PESATORI CABINA", 
  44.       "PISTONE IDRAULICO", 
  45.       "PORTA DI CABINA A GHIGLIOTTINA", 
  46.       "PORTA DI CABINA AUTOMATICA", 
  47.       "PORTA DI PIANO AUTOMATICHE", 
  48.       "PORTE AD 1 BATTENTE", 
  49.       "PORTE AD 2 BATTENTI", 
  50.       "PORTE DI PIANO A GHIGLIOTTINA", 
  51.       "PRECABLAGGI", 
  52.       "PULEGGE", 
  53.       "QUADRI 2V", 
  54.       "QUADRI A RELE", 
  55.       "QUADRI VARIATORE FREQ.", 
  56.       "QUADRO DISTRIBUZIONE F.M.", 
  57.       "QUADRO SINOTTICO", 
  58.       "RACCORDERIA PER TUBAZIONI IDRAULICHE", 
  59.       "RICAMBI ARGANO", 
  60.       "RISCALDAMENTO OLIO", 
  61.       "RIVESTIMENTO CABINA", 
  62.       "SCAMBIATORE DI CALORE", 
  63.       "SCHEDE ELETTRONICHE", 
  64.       "SEGNALATORI", 
  65.       "SERRATURE", 
  66.       "SINTESI VOCALI", 
  67.       "SOSPENSIONI PORTE", 
  68.       "SPECCHIO O VETRO", 
  69.       "STAFFE DI VANO", 
  70.       "TENDITORE LIMITATORE VELOCITA'", 
  71.       "TUBAZIONE IDRAULICA", 
  72.       "VARIATORI DI FREQUENZA"}; 
  73.  
  74.   public void doGet(HttpServletRequest request, HttpServletResponse response) throws 
  75.       ServletException, IOException { 
  76.     response.setContentType("text/html"); 
  77.     response.getWriter().println(manageRequest(request)); 
  78.  
  79.   private String manageRequest(HttpServletRequest req) { 
  80.     String id = req.getParameter("id"); 
  81.     String param = req.getParameter("param"); 
  82.     String target = req.getParameter("target"); 
  83.     if ( (id == null) || 
  84.         (param == null) || 
  85.         (target == null) 
  86.         ) { 
  87.       return ""; 
  88.     if (id.equals("product")) { 
  89.       return generateScriptWith(id, param, target); 
  90.     return ""; 
  91.  
  92.   public String generateScriptWith(String id, String param, String target) { 
  93.     StringBuffer sb = new StringBuffer(); 
  94.     sb.append("function callback(){") 
  95.         .append("\n  var t = document.getElementById('" + target + "');") 
  96.         .append("\n  t.innerHTML = '" + createFilteredBody(param) + "';\n") 
  97.         .append("}\n") 
  98.         .append("callback();\n"); 
  99.     return sb.toString(); 
  100.  
  101.  
  102.   public String createFilteredBody(String search) { 
  103.     int counter = 0; 
  104.     StringBuffer sb = new StringBuffer(); 
  105.     sb.append("<table>"); 
  106.     for (int i = 0; i < products.length; i++) { 
  107.       if (products[i].toLowerCase().indexOf(search) >= 0) { 
  108.         String value = products[i].replace('\'', ' '); 
  109.         sb.append("<tr><td style=\"width:270px;background:").append((counter%2==0?"#e5e5e5;":"#c3c3c3;")).append("\">") 
  110.             .append("<a href=\"#\" onclick=\"return assign(this)\" >") 
  111.             .append(value) 
  112.             .append("</a></td></tr>"); 
  113.         ++counter; 
  114.     sb.append("</table>"); 
  115.     return sb.toString(); 
  116.  

Informazioni sull'autore

Stefano Fago, classe 1973. Diplomato in ragioneria, ha conseguito il Diploma di Laurea in Informatica con un progetto legato alle interfacce grafiche soft-realtime in Java. Dopo esperienze in Alcatel ed Elea, ha svolto attività di consulenza come Software Developer e Trainer alla ObjectWay S.p.A. sede di Milano. Attualmente Software Designer presso la sezione Innovazione e Attività Progettuali di BPU Banca. Appassionato del linguaggio Java e di tutte le tecnolgie Object Oriented. Polistrumentista dilettante.

È possibile consultare l'elenco degli articoli scritti da Stefano Fago.

Altri articoli sul tema Tip / AJAX.

Discuti sul forum   Stampa

Cosa ne pensi di questo articolo?

Discussioni

Questo articolo o l'argomento ti ha interessato? Parliamone.