| |||
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... |
| |||
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: Para esto necesitas en tu base de datos una tabla AUTOCOMPLETADOR:
Código:
Este código fuente es de libre utilización y modificación bajo la siguiente licencia: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; 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 |
| |||
Re: autocompletar.... El segundo es INDEX_PROCESO.JS
Código:
y probablemente necesites un archivos CSS que bien podria ser este o uno propio tuyo: INDEX_ESTILOS.CSSfunction 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; } 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 |
| |||
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... |
| ||||
Respuesta: autocompletar.... Esta genial gracias ... pero como seria la expresion regular si queremos que acepte todo tipo de caracteres ?? muchas gracias amigo
__________________ Sabes porque el internet es la forma para hacer mucho dinero ahora mismo? VIsita esta pagina |