Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Utilizar autocompletado con varios text.

Estas en el tema de Utilizar autocompletado con varios text. en el foro de Frameworks JS en Foros del Web. Hola a todos, vereis, he sacado de un libro sobre AJAX ( Manual Imprescindible de Ajax, Javier Mellado Domínguez, Anaya Multimedia ) un ejemplo para ...
  #1 (permalink)  
Antiguo 31/01/2009, 14:18
Avatar de tangela  
Fecha de Ingreso: octubre-2004
Mensajes: 31
Antigüedad: 20 años, 1 mes
Puntos: 0
Pregunta Utilizar autocompletado con varios text.

Hola a todos, vereis, he sacado de un libro sobre AJAX (Manual Imprescindible de Ajax, Javier Mellado Domínguez, Anaya Multimedia) un ejemplo para que aparezca una lista recogida de una base de datos para autocompletar los datos que se van introduciendo en el text.
El ejemplo funciona a la perfección y me vendría muy bien para una aplicación de control de la biblioteca del colegio en que trabajo, lo que pasa es que necesito que el mismo proceso se repita en tres campos distintos (diferentes tablas, también) y no tengo ni idea de como implementarlo.

La aplicación la componen tres archivos: autocompletar.html; funciones.js y proceso.php

Os pego las funciones javascript que hacen el trabajo.
Código javascript:
Ver original
  1. function asignaVariables()
  2. {
  3.     v=1;
  4.     nuevaBusqueda=1;
  5.     busqueda=null;
  6.     ultimaBusquedaNula=null;
  7.     divLista=document.getElementById("lista");
  8.     inputLista=document.getElementById("input_2");
  9.     elementoSeleccionado=0;
  10.     ultimoIdentificador=0;
  11. }
  12.  
  13. unction rellenaLista()
  14. {
  15.     var valor=inputLista.value;
  16.     var reg=/(^[a-zA-Z0-9]{2,40}$)/;
  17.     if (!reg.test(valor))
  18.     {
  19.         divLista.style.display="none";
  20.     }else{
  21.         if(busquedaEnBD()==0)
  22.         {
  23.             busqueda=valor;
  24.             filtraLista(valor);
  25.             if (divLista.childNodes[0]==null)
  26.             {
  27.                 divLista.style.display="none";
  28.                 nuevaCadenaNula(valor);
  29.             }else{
  30.                 reiniciaSeleccion();
  31.                 formateaLista(valor);
  32.             }
  33.         } else{
  34.             busqueda=valor;
  35.             var ajax= nuevoAjax();
  36.             ajax.open("POST", "proceso.php?", true);
  37.             ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  38.             ajax.send("busqueda="+valor);
  39.             ajax.onreadystatechange=function()
  40.             {
  41.                 if (ajax.readyState==4){
  42.                     if (!ajax.responseText){
  43.                         divLista.style.display="none";
  44.                     }else{
  45.                         var respuesta=new Array(2);
  46.                         respuesta = ajax.responseText.split("&");
  47.                         nuevaBusqueda=respuesta[0];
  48.                         if (respuesta[1] !="vacio")
  49.                         {
  50.                             divLista.style.display="block";
  51.                             divLista.innerHTML=respuesta[1];
  52.                             reiniciaSeleccion();
  53.                             formateaLista(valor);
  54.                         } else
  55.                         {
  56.                          nuevaCadenaNula(valor);
  57.                         }
  58.                     }  
  59.                 }
  60.             }
  61.         }  
  62.     }
  63. }
El código del formulario html es el siguiente:
Código html:
Ver original
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.3w.org/TR/html4/strict.dtd">
  2. <title> Ejemplo autocompletar</title>
  3. <link rel="stylesheet" type="text/css" href="estilo.css">
  4. <script type="text/javascript" src="funciones.js"></script>
  5. <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  6. </head>
  7.     <body onload="asignaVariables();">
  8.         <div id="contenedor">
  9.             <table>
  10.                 <tr>
  11.                 <td><label id="Nome">Nome: </label></td>
  12.                 <td>
  13.                 <input name="Nome" type="text" id="input_2" autocomplete="off" class="input" size="85" width="100px" onfocus="
  14.                 if (document.getElementById('lista').childNodes[0] !=null && this.value !=''){
  15.                 filtraLista(this.value);
  16.                 formateaLista(this.value);
  17.                 reiniciaSeleccion();
  18.                 document.getElementById('lista').style.display='block';
  19.                 }"
  20.                 onblur="if (v==1) document.getElementById('lista').style.display='none';"
  21.                 onkeyup="if (navegaTeclado(event)==1){rellenaLista();}"></input>
  22.                 <div id="lista" onmouseout="v=1;" onmouseover="v=0;"></div>
  23.                 </td>
  24.                 </tr>
  25.                
  26.             </table>
  27.         </div> 
  28.     </body>
  29. </html>
El código PHP:
Código php:
Ver original
  1. <?php
  2. function validaBusqueda($parametro)
  3. {
  4.     if(eregi("^[a-zA-Z0-9]{2,40}$",$parametro)) return TRUE;
  5.     else return FALSE;
  6. }
  7. if(isset($_POST["busqueda"]))
  8. {
  9.     $valor=$_POST["busqueda"];
  10.     if (validaBusqueda($valor))
  11.     {
  12.         $conexion=mysql_connect("localhost", "root", "") or die(mysql_error());
  13.         mysql_select_db("biblioteca") or die(mysql_error());
  14.         $consulta=mysql_query("SELECT autor FROM autores WHERE autor LIKE '".$valor."%' ORDER BY autor LIMIT 0, 60");
  15.         mysql_close($conexion);
  16.         $cantidad=mysql_num_rows($consulta);
  17.         if($cantidad==0)
  18.         {
  19.             echo "0&vacio";
  20.         }
  21.         else
  22.         {
  23.             if($cantidad>20) echo "1&";
  24.             else echo "0&";
  25.            
  26.             $cantidad=1;
  27.             while(($registro=mysql_fetch_row($consulta)) && $cantidad<=20)
  28.             {
  29.                 echo "<div onClick=\"clickLista(this);\" onMouseOver=\"mouseDentro(this);\">".$registro[0]."</div>";
  30.                 $cantidad++;
  31.             }
  32.         }
  33.     }
  34. }
  35. ?>
Me gustaría saber como hacer para incluir otros campos de texto y que accedan también a estas funciones aún cuando deban ir a otras tablas.

Espero haberme explicado bien; si necesistais otras partes del código, no hay más que decirlo.
Gracias y un saludo.
PD: A los moderadores: no sé si es correcto poner tanto código en un post, pero no sé tampoco si se pueden adjuntar ficheros. Mis disculpas si incurrí en alguna falta; ha sido por desconocimiento.

Última edición por tangela; 04/02/2009 a las 16:11 Razón: resaltar codigo
  #2 (permalink)  
Antiguo 04/02/2009, 16:32
Avatar de tangela  
Fecha de Ingreso: octubre-2004
Mensajes: 31
Antigüedad: 20 años, 1 mes
Puntos: 0
Respuesta: Utilizar autocompletado con varios text.

Pues tengo una parte de la solución:
En el código javascript comenté la línea 8 de la funcion asignaVariables:
Código javascript:
Ver original
  1. //inputLista=document.getElementById("input_2");
y esta misma declaración la introduje en el código html de definición de cada uno de los text:
Código html:
Ver original
  1. <input name="Nome" type="text" id="input_2" autocomplete="off" class="input" size="85" width="100px" onfocus="
  2.               inputLista=document.getElemetById("input_2")
  3.                if (document.getElementById('lista').childNodes[0] !=null && this.value !=''){
  4.                filtraLista(this.value);
  5.                formateaLista(this.value);
  6.                reiniciaSeleccion();
  7.                document.getElementById('lista').style.display='block';
  8.                }"
REpitiendo esto en cada uno de los cuadros de texto y asignando un nuevo valor a inputLista y modificando el id del imput se van rellenando con la lista de autocompletar.

Esta es la parte de la solución. La otra parte no la tengo clara, y lo que he hecho ha sido una chapuza porque contradice los principios de economía y reutilización de código propios de la programación.
1.- Tripliqué la funcion rellenaLista con distintos nombres y llamando a diferentes páginas php en función del campo y tabla que quiera incorporar:
Código javascript:
Ver original
  1. ajax.open("POST", "proceso.php?", true);

2.- Cambié el código en el evento onKeyUp del input (el que llama a la función de llenado de la lista), llamando a una función diferente en cada caso, según lo explicado en el punto anterior
Código javascript:
Ver original
  1. onkeyup="if (navegaTeclado(event)==1){rellenaLista();}"></input>

Así, repitiendo el proceso para cada text, consigo que cada uno cargue la lista que necesito.
Soy plenamente consciente de que esto no es un ejemplo de programación, pero de momento hace lo que necesito y espero mejorarlo pronto.
Debo hacer notar que esta aplicación se utiliza en un ámbito muy reducido y por pocas personas, por lo que la economía de recursos no es un aspecto primordial.

Se admiten sugerencias para mejorar este ¿codigo?
Saludos.
  #3 (permalink)  
Antiguo 25/02/2009, 08:59
 
Fecha de Ingreso: abril-2007
Mensajes: 110
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: Utilizar autocompletado con varios text.

Saludos

hombre te cuento que me paso lo mismo y lo estoy solucionado casi con el mismo camino solo que repeti mas fuinciones en el ajax ahh y no me funciono la parte donde el input lo pasas al js y comentas la linea

//inputLista=document.getElementById("input_2");

el unico problema que me quedo fue que al seleccionar el listado arrojado por el segundo text me lo pone en el primero y no limpia la lista.

gracias por su aporte si encontraste otro camino me seria de gran ayuda
feliz dia
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:21.