Foros del Web » Programando para Internet » Javascript »

autocompletar....

Estas en el tema de autocompletar.... en el foro de Javascript en Foros del Web. que tal amigos, e buscado mucho pero no encuentro el codigo para autocompletar cuando esta un usuario escribiendo en un campo de texto como pasa ...
  #1 (permalink)  
Antiguo 18/01/2007, 13:20
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
Pregunta autocompletar....

que tal amigos, e buscado mucho pero no encuentro el codigo para autocompletar cuando esta un usuario escribiendo en un campo de texto como pasa en google o en la pagina de www.mexicana.com.mx, alguien sabe clmo hacer eso? si no me di a explicar diganme , de antemano gracias!!!
__________________
Wow! No se que decir...
  #2 (permalink)  
Antiguo 14/02/2007, 11:46
 
Fecha de Ingreso: enero-2007
Ubicación: Cochabamba - Bolivia
Mensajes: 346
Antigüedad: 17 años, 3 meses
Puntos: 2
Re: autocompletar....

Existe codigo en AJAX que ya lo postearon por ahi y yo lo utilice y esta barbaro. Son 2 Archivos unicamente que tienes que utilizarlos, un JS y un PHP los tienes que tener en el mismo lugar de donde tendras tu PHP con campos de texto que quieres autocompletar y solo llamas a sus funciones de dichos archivos.

Estos son 3:

(Tienes que grabarlos con sus mismos nombres)

El primero: INDEX_PROCESO.PHP

Código PHP:
<?php
function validaIngreso($parametro)
{
    
// Funcion utilizada para validar el dato a ingresar recibido por GET
    
$parametro=trim($parametro);
    
    if(
eregi("^[a-zA-Z0-9.@ ]{4,40}$"$parametro)) return TRUE;
    else return 
FALSE;
}

function 
validaBusqueda($parametro)
{
    
// Funcion para validar la cadena de busqueda de la lista desplegable
    
if(eregi("^[a-zA-Z0-9.@ ]{2,40}$"$parametro)) return TRUE;
    else return 
FALSE;
}

if(
$_POST["ingreso"])
{
    
$valor=$_POST["ingreso"];
    if(
validaIngreso($valor))
    {
        
$coneccion=mysql_connect("localhost""root""") or die(mysql_error());
        
mysql_select_db("ajax"$coneccion) or die(mysql_error());
        
        
$consulta=mysql_query("SELECT COUNT(*) FROM autocompletador") or die(mysql_error());
        
$registro=mysql_fetch_row($consulta);

        if(
$registro[0]>=600) { echo "Hay demasiados registros en la Base de Datos"; die(); }
        
        
$consulta=mysql_query("SELECT * FROM autocompletador WHERE nombre='$valor'") or die(mysql_error());
        
$registro=mysql_fetch_row($consulta);
        
        if(
$registro) { echo "Ya existe tu nombre en la Base de Datos"; }
        else
        {
            
mysql_query("INSERT into autocompletador (nombre) VALUES ('$valor')");
            echo 
"Tu nombre ha sido ingresado";
        }
        
mysql_close($coneccion);
    }
}
if(
$_POST["busqueda"])
{
    
$valor=$_POST["busqueda"];
    if(
validaBusqueda($valor))
    {
        
$coneccion=mysql_connect("localhost""root""") or die(mysql_error());
        
mysql_select_db("ajax"$coneccion) or die(mysql_error());
        
        
//$consulta=mysql_query("SELECT nombre FROM autocompletador WHERE MATCH(nombre) AGAINST('".$valor."*' IN BOOLEAN MODE) LIMIT 0, 22") or die(mysql_error());
        
$consulta=mysql_query("SELECT nombre FROM autocompletador WHERE nombre LIKE '".$valor."%' LIMIT 0, 22");
        
        
mysql_close($coneccion);
        
        
$cantidad=mysql_num_rows($consulta);
        if(
$cantidad==0)
        {
            
/* 0: no se vuelve por mas resultados
            vacio: cadena a mostrar, en este caso no se muestra nada */
            
echo "0&vacio";
        }
        else
        {
            if(
$cantidad>20) echo "1&"
            else echo 
"0&";
    
            
$cantidad=1;
            while((
$registro=mysql_fetch_row($consulta)) && $cantidad<=20)
            {
                echo 
"<div onClick=\"clickLista(this);\" onMouseOver=\"mouseDentro(this);\">".$registro[0]."</div>";
                
// Muestro solo 20 resultados de los 22 obtenidos
                
$cantidad++;
            }
        }
    }
}
?>


Para esto necesitas en tu base de datos una tabla AUTOCOMPLETADOR:


Código:
CREATE TABLE `autocompletador` (
  `id` int(5) NOT NULL auto_increment,
  `nombre` varchar(102) NOT NULL default '',
  PRIMARY KEY  (`id`),
  FULLTEXT KEY `nombre` (`nombre`)
) TYPE=MyISAM;
Este código fuente es de libre utilización y modificación bajo la siguiente licencia:
http://creativecommons.org/licenses/by-nc-sa/2.5/
Puedes distribuir estos scripts o colocarlos en tu Sitio siempre y cuando no elimines estos
comentarios y la licencia expuesta sea respetada.

Mas ejemplos y material sobre AJAX en: http://www.formatoweb.com.ar/ajax
Cualquier sugerencia, crítica o comentario son bienvenidos.
Contacto: [email protected]

Última edición por makeitslow; 03/03/2007 a las 21:37
  #3 (permalink)  
Antiguo 14/02/2007, 11:55
 
Fecha de Ingreso: enero-2007
Ubicación: Cochabamba - Bolivia
Mensajes: 346
Antigüedad: 17 años, 3 meses
Puntos: 2
Re: autocompletar....

El segundo es INDEX_PROCESO.JS

Código:
function asignaVariables()
{
	// Funcion que asigna variables que se usan a lo largo de las funciones	
	v=1; nuevaBusqueda=1; busqueda=null; ultimaBusquedaNula=null;
	divLista=document.getElementById("lista");
	inputLista=document.getElementById("input_2");
	elementoSeleccionado=0;
	ultimoIdentificador=0;
}

function nuevoAjax()
{ 
	/* Crea el objeto AJAX. Esta funcion es generica para cualquier utilidad de este tipo, por
	lo que se puede copiar tal como esta aqui */
	var xmlhttp=false; 
	try 
	{ 
		// Creacion del objeto AJAX para navegadores no IE
		xmlhttp=new ActiveXObject("Msxml2.XMLHTTP"); 
	}
	catch(e)
	{ 
		try
		{ 
			// Creacion del objet AJAX para IE 
			xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
		} 
		catch(E) { xmlhttp=false; }
	}
	if (!xmlhttp && typeof XMLHttpRequest!="undefined") { xmlhttp=new XMLHttpRequest(); } 

	return xmlhttp; 
}

function eliminaEspacios(cadena)
{
	// Funcion para eliminar espacios delante y detras de cada cadena
	while(cadena.charAt(cadena.length-1)==" ") cadena=cadena.substr(0, cadena.length-1);
	while(cadena.charAt(0)==" ") cadena=cadena.substr(1, cadena.length-1);
	return cadena;
}

function nuevoDato()
{
	/* Funcion encargada del input de la izquierda. No interfiere para nada en la funcionalidad de
	la lista desplegable */
	var divMensaje=document.getElementById("mensaje");
	var inputIngreso=document.getElementById("input_1");
	var boton=document.getElementById("boton_1");
	var valor=inputIngreso.value;

	// Reinicio las variables del input 2
	inputLista.value=""; nuevaBusqueda=1; busqueda=null; ultimaBusquedaNula=null;

	// Limpio posibles mensajes que haya en el div
	divMensaje.innerHTML="";

	// Saco los espacios en blanco al comienzo y al final de la cadena
	valor=eliminaEspacios(valor);
	
	// Valido con una expresion regular el contenido de lo que el usuario ingresa
	var reg=/(^[a-zA-Z0-9.@ ]{4,40}$)/;
	if(!reg.test(valor)) 
	{
		divMensaje.innerHTML="El texto ingresado contiene caracteres o longitud inválida";
	}
	else
	{
		// Deshabilito el boton y el input para evitar dobles ingresos
		boton.disabled=true; inputIngreso.disabled=true; inputLista.disabled=true;
		inputIngreso.value="Ingresando...";
	
		var ajax=nuevoAjax();
		ajax.open("POST", "index_proceso.php?", true);
		ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		ajax.send("ingreso="+valor);
			
		ajax.onreadystatechange=function()
		{
			if (ajax.readyState==4)
			{
				// Borro el contenido del input
				inputIngreso.value="";
				// Habilito campos y boton nuevamente
				boton.disabled=false; inputIngreso.disabled=false; inputLista.disabled=false;
				divMensaje.innerHTML=ajax.responseText;
			}
		}
	}
}

function formateaLista(valor)
{
	// Funcion encargada de ir colocando en negrita las palabras y asignarle un ID a los elementos
	var x=0, verificaExpresion=new RegExp("^("+valor+")", "i");
	
	while(divLista.childNodes[x]!=null)
	{
		// Asigo el ID para reconocerlo cuando se navega con el teclado
		divLista.childNodes[x].id=x+1;
		// Coloco en cada elemento de la lista en negrita lo que se haya ingresado en el input
		divLista.childNodes[x].innerHTML=divLista.childNodes[x].innerHTML.replace(verificaExpresion, "<b>$1</b>");
		x++;
	}
}

function limpiaPalabra(palabra)
{
	// Funcion encargada de sacarle el codigo HTML de la negrita a las palabras
	palabra=palabra.replace(/<b>/i, "");
	palabra=palabra.replace(/<\/b>/i, "");
	return palabra;
}

function coincideBusqueda(palabraEntera, primerasLetras)
{
	/* Funcion para verificar que las primeras letras de busquedaActual sean iguales al
	contenido de busquedaAnterior. Se devuelve 1 si la verificacion es afirmativa */
	if(primerasLetras==null) return 0;
	var verificaExpresion=new RegExp("^("+primerasLetras+")", "i");
	if(verificaExpresion.test(palabraEntera)) return 1;
	else return 0;
}

function nuevaCadenaNula(valor)
{
	/* Seteo cual fue la ultima busqueda que no arrojo resultados siempre y cuando la cadena
	nueva no comience con las letras de la ultima cadena que no arrojo resultados */
	if(coincideBusqueda(valor, ultimaBusquedaNula)==0) ultimaBusquedaNula=valor;
}

function busquedaEnBD()
{
	/* Funcion encargada de verificar si hay que buscar el nuevo valor ingresado en la base
	de datos en funcion de los resultados obtenidos en la ultima busqueda y en base a que
	la cadena bsucada anteriormente este dentro de la nueva cadena */
	var valor=inputLista.value;
	
	if((coincideBusqueda(valor, busqueda)==1 && nuevaBusqueda==0) || coincideBusqueda(valor, ultimaBusquedaNula)==1) return 0;
	else return 1;
}

function filtraLista(valor)
{
	// Funcion encargada de modificar la lista de nombres en base a la nueva busqueda
	var x=0;

	while(divLista.childNodes[x]!=null)
	{
		// Saco la negrita a los elementos del listado
		divLista.childNodes[x].innerHTML=limpiaPalabra(divLista.childNodes[x].innerHTML);
		if(coincideBusqueda(limpiaPalabra(divLista.childNodes[x].innerHTML), valor)==0)
		{
			/* Si remuevo el elemento x, el elemento posterior pasa a ocupar la posicion de
			x, entonces quedaria sin revisar. Por eso disminuyo 1 valor a x */
			divLista.removeChild(divLista.childNodes[x]);
			x--;
		}
		x++;
	}
}

function reiniciaSeleccion()
{
	mouseFuera(); 
	elementoSeleccionado=0;
}

function navegaTeclado(evento)
{
	var teclaPresionada=(document.all) ? evento.keyCode : evento.which;
	
	switch(teclaPresionada)
	{
		case 40:
		if(elementoSeleccionado<divLista.childNodes.length)
		{
			mouseDentro(document.getElementById(parseInt(elementoSeleccionado)+1));
		}
		return 0;
		
		case 38:
		if(elementoSeleccionado>1)
		{
			mouseDentro(document.getElementById(parseInt(elementoSeleccionado)-1));
		}
		return 0;
		
		case 13:
		if(divLista.style.display=="block" && elementoSeleccionado!=0)
		{
			clickLista(document.getElementById(elementoSeleccionado))
		}
		return 0;
		
		default: return 1;
	}
}	

function rellenaLista()
{
	var valor=inputLista.value;

	// Valido con una expresion regular el contenido de lo que el usuario ingresa
	var reg=/(^[a-zA-Z0-9.@ ]{2,40}$)/;
	if(!reg.test(valor)) divLista.style.display="none";
	else
	{
		if(busquedaEnBD()==0)
		{	
			// Si no hay que buscar el valor en la BD
			busqueda=valor;
	
			// Hago el filtrado de la nueva cadena ingresada
			filtraLista(valor);
			// Si no quedan elementos para mostrar en la lista
			if(divLista.childNodes[0]==null) { divLista.style.display="none"; nuevaCadenaNula(valor); }
			else { reiniciaSeleccion(); formateaLista(valor); }
		}
		else
		{	
			/* Si se necesita verificar la base de datos, guardo el patron de busqueda con el que se
			busco y luego recibo en una variable si existen mas resultados de los que se van a mostrar */
			busqueda=valor;

			var ajax=nuevoAjax();
			ajax.open("POST", "index_proceso.php?", true);
			ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			ajax.send("busqueda="+valor);
		
			ajax.onreadystatechange=function()
			{	
				if (ajax.readyState==4)
				{
					if(!ajax.responseText) { divLista.style.display="none"; }
					else 
					{
						var respuesta=new Array(2);
						respuesta=ajax.responseText.split("&");
				
						/* Obtengo un valor que representa si tengo que ir a BD en las proximas 
						busquedas con cadena similar */
						nuevaBusqueda=respuesta[0];
				
						// Si se obtuvieron datos los muestro
						if(respuesta[1]!="vacio") 
						{ 
							divLista.style.display="block"; divLista.innerHTML=respuesta[1]; 
							// Coloco en negrita las palabras
							reiniciaSeleccion();
							formateaLista(valor); 
						}
						// En caso contrario seteo la busqueda actual como una busqueda sin resultados
						else nuevaCadenaNula(valor);
					}
				}
			}
		}
	}
}

function clickLista(elemento)

{
	/* Se ejecuta cuando se hace clic en algun elemento de la lista. Se coloca en el input el
	valor del elemento clickeado */
	v=1;
	valor=limpiaPalabra(elemento.innerHTML); 
	busqueda=valor; inputLista.value=valor;
	divLista.style.display="none"; elemento.className="normal";
}

function mouseFuera()
{
	// Des-selecciono el elemento actualmente seleccionado, si es que hay alguno
	if(elementoSeleccionado!=0 && document.getElementById(elementoSeleccionado)) document.getElementById(elementoSeleccionado).className="normal"; 
}

function mouseDentro(elemento)
{
	mouseFuera();
	elemento.className="resaltado";
	// Establezco el nuevo elemento seleccionado
	elementoSeleccionado=elemento.id;
}
y probablemente necesites un archivos CSS que bien podria ser este o uno propio tuyo: INDEX_ESTILOS.CSS


Este código fuente es de libre utilización y modificación bajo la siguiente licencia:

Puedes distribuir estos scripts o colocarlos en tu Sitio siempre y cuando no elimines estos
comentarios y la licencia expuesta sea respetada.

Mas ejemplos y material sobre AJAX en:
Cualquier sugerencia, crítica o comentario son bienvenidos.
Contacto: [email protected]

Última edición por makeitslow; 03/03/2007 a las 21:27
  #4 (permalink)  
Antiguo 14/02/2007, 14:12
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
Re: autocompletar....

ok, muchas gracias, pero justo apenas encontre otro codigo que es puro JS y es ams conveniente para el sistema que hago...sin usar PHP ni AJAX, pero muchas gracias de todas maneras!!!
__________________
Wow! No se que decir...
  #5 (permalink)  
Antiguo 14/02/2007, 18:32
 
Fecha de Ingreso: enero-2007
Ubicación: Cochabamba - Bolivia
Mensajes: 346
Antigüedad: 17 años, 3 meses
Puntos: 2
Re: autocompletar....

Suena bien, y puedes utilizar varios autocompletar en un solo formulario?
  #6 (permalink)  
Antiguo 21/03/2011, 11:24
Avatar de GXT2  
Fecha de Ingreso: junio-2009
Ubicación: Fort Lauderdale, FL
Mensajes: 152
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: autocompletar....

Esta genial gracias ...
pero como seria la expresion regular
si queremos que acepte todo tipo de caracteres
??

muchas gracias amigo
  #7 (permalink)  
Antiguo 10/06/2011, 14:26
Avatar de arielcasanova  
Fecha de Ingreso: octubre-2004
Ubicación: Bahía Blanca - Argentina
Mensajes: 332
Antigüedad: 19 años, 6 meses
Puntos: 1
Respuesta: autocompletar....

Es genial el script y me funciona muy bien.. el tema es con los caracteres especiales, como la "ñ", que el autocompletar me la muestra como un rombito negro, y obviamente, no devuelve el resultado. Si le reemplazo el rombito por la "ñ" lo encuentra sin problemas... ¿saben cómo solucionarlo?
__________________
Ariel Casanova
diseño y desarrollo web estratégico
www.emporia.com.ar
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 18:01.