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

Ayuda autocompletar combobox ajax

Estas en el tema de Ayuda autocompletar combobox ajax en el foro de Frameworks JS en Foros del Web. Hola amigos, les cuento que he estado buscando por mas de 5 o 6 hs un ejemplo claro de lo que necesito hacer sin poder ...
  #1 (permalink)  
Antiguo 01/03/2011, 12:07
 
Fecha de Ingreso: marzo-2011
Mensajes: 2
Antigüedad: 13 años, 1 mes
Puntos: 0
Pregunta Ayuda autocompletar combobox ajax

Hola amigos, les cuento que he estado buscando por mas de 5 o 6 hs un ejemplo claro de lo que necesito hacer sin poder encontrarlo por ningun lado.

tengo una base de datos con clientes, los cuales tengo que traer dentro de un combobox (select) en un formulario. el combo guarda el id y el nombre de cada cliente. El problema es que son 18000 clientes aproximadamente, y cargar el combo cada vez se hace pesadisimo y demora 4 o 5 minutos para completarlo.

Entonces necesitaria traer un combo vacio, donde el usuario pueda escribir el nombre del cliente y que este muestre opciones para que el usuario seleccione el que necesita.
Algo asi como los autocompletar de hotmail o gmail.

he visto miles de ejemplos pero ninguno hace lo que quiero exactamente, y creo que no es tan complejo.

seria cuestion de crear el combo en el formulario y por medio de java y ajax realizar una consulta a la base de datos con un LIKE enviando como parametro el texto ingresado por el usuario, esta consulta deberia generar un xml para poblar el combo.

el tema es que no estoy tan familiarizado con ajax y dhtml... si alguien tiene un ejemplo concreto, sin usar plugins externos, ni archivos .js raros seria de gran ayuda.

Desde ya muchas gracias!
  #2 (permalink)  
Antiguo 01/03/2011, 14:12
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Ayuda autocompletar combobox ajax

5 ó 6 horas de búsqueda infructuosa. lo tienes mas cerca de lo que crees
  #3 (permalink)  
Antiguo 01/03/2011, 16:44
 
Fecha de Ingreso: marzo-2011
Mensajes: 2
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Ayuda autocompletar combobox ajax

Muchas gracias IsaBelM por tu pronta respuesta! pero lamento informar que he configurado el php para que se conecte a mi bd, lo he probado y funciona perfectamente.
Al momento de escribir mas de 2 caracteres en el html no hace absolutamente nada!

Ademas, necesito autocompletar el nombre del usuario, pero tambien necesito guardar su id, ya que esto va en un formulario donde al enviarlo el id del usuario seleccionado se guarda en otra tabla de la base de datos. por eso mi propuesta era la de usar un xml.

si alguien se anima a revisar el codigo, aqui esta:

archivo SelUsuario.html

Código HTML:
Ver original
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html xmlns="http://www.w3.org/1999/xhtml"lang="es" xml:lang="es">
  3. <meta name="http-equiv" content="Content-type: text/html; charset=UTF-8"/>
  4. <STYLE TYPE="text/css">
  5. #contenedorOpt div.seleccionado {font-weight:bold; background:#F0F0F0; color:#FF6600;}
  6. #contenedorOpt div.deseleccionado {background:#FFFFFF; color:#000000;}
  7. #contenedorOpt div {font:11px verdana; color:#000000; cursor:pointer; text-align:left; padding:2px 5px;}
  8.  
  9. .capa {
  10. background: #FFFFFF;
  11. border:1px solid rgb(120,120,120);
  12. width: 144px;
  13. _width: 146px;
  14. text-align: left;
  15. position: absolute;
  16. }
  17. <script type="text/javascript">
  18. var TxtId = ''; // el texbox desde donde se lanza la consulta y donde ha de imprimirse la opción cuando se usa la función Pegar
  19.  
  20. var SelUsuario = {
  21.  
  22. captura_objeto : function(idnombre) {
  23.         return document.getElementById(idnombre);
  24. },
  25.  
  26.  
  27. Evento: function (elemento,nomevento,funcion) {
  28.       if (elemento.attachEvent) {
  29.               var f=function() {
  30.                 funcion.call(elemento,window.event);
  31.             }
  32.             elemento.attachEvent('on'+nomevento,f);
  33.             return true;
  34.       } else if (elemento.addEventListener) {
  35.               elemento.addEventListener(nomevento,funcion,false);
  36.               return true;
  37.         }else{
  38.               return false;
  39.     }
  40. },
  41.  
  42.  
  43. creaAjax: function (){
  44. var ajax = false;
  45.     ajax = new XMLHttpRequest();
  46. return ajax;
  47. },
  48.  
  49.  
  50. init: function(){
  51. var tablas = document.body.getElementsByTagName('table');
  52.     for (i=0; i < tablas.length; i++) {
  53.        var inpt = tablas[i].getElementsByTagName('input');
  54.                SelUsuario.Evento(SelUsuario.captura_objeto(inpt[2].id), 'keyup', SelUsuario.Empieza);
  55.                SelUsuario.Evento(SelUsuario.captura_objeto('contenedorOpt'), 'mouseover', SelUsuario.Seleccionar);
  56.               SelUsuario.Evento(SelUsuario.captura_objeto(inpt[2].id), 'keydown', SelUsuario.Pegar2);
  57.                SelUsuario.Evento(SelUsuario.captura_objeto(inpt[2].id), 'blur', SelUsuario.Cerrar);
  58.    }
  59. },
  60.  
  61.  
  62.  
  63. PosicionAbsolutaElemento: function(elTxtBox)  {
  64.      if (typeof elTxtBox == "string")
  65.        var elTxtBox = SelUsuario.captura_objeto(elTxtBox);
  66.            if (!elTxtBox) return { top:0,left:0 };
  67.          var y = 0;
  68.          var x = 0;
  69.              while (elTxtBox.offsetParent) {
  70.                    x += elTxtBox.offsetLeft;
  71.                    y += elTxtBox.offsetTop;
  72.                elTxtBox = elTxtBox.offsetParent;
  73.              }
  74.          return {top:y,left:x};
  75.  
  76. },
  77.  
  78.  
  79. Desplieaga: function(posLeft,posTop) {
  80. var elDiv = SelUsuario.captura_objeto('contenedorOpt');
  81.    elDiv.style.left = posLeft+'px';
  82.    elDiv.style.top = parseInt(posTop+21) +'px';
  83.            elDiv.style.display = 'block';
  84.    elDiv.style.zIndex = 100;
  85. },
  86.  
  87.  
  88. Empieza: function (ev) {
  89. TxtId = SelUsuario.captura_objeto(this.id).id;
  90. var elTxtBox = SelUsuario.captura_objeto(this.id);
  91. var str = elTxtBox.value;
  92. var elDiv = SelUsuario.captura_objeto('contenedorOpt');
  93. var opt = elDiv.getElementsByTagName('DIV');
  94. var keyCode = document.layers ? ev.which : document.all ? event.keyCode : document.getElementById ? ev.keyCode : 0;
  95.  
  96.     if (keyCode == 40) {
  97.        SelUsuario.BajaOpt ('contenedorOpt')
  98.  
  99.     } else if (keyCode == 38) {
  100.        SelUsuario.SubeOpt ('contenedorOpt')
  101.  
  102.    } else if (keyCode == 13) {
  103.        for (var i = 0; i <= opt.length-1; i++) {
  104.            if (opt[i].className == "seleccionado") {
  105.                str = opt[i].id;
  106.                if (elDiv.style.display == "block"); elDiv.style.display= "none";
  107.        break;
  108.            }
  109.        }
  110.  
  111.        try{
  112.            ev.preventDefault();
  113.        }catch(e){
  114.            ev.returnValue = false;
  115.        }
  116.    } else {
  117.  
  118.        if (str.length < 2) {
  119. if (elDiv.style.display == "none")  elDiv.style.display= "none";
  120. else elDiv.style.display= "none";    
  121. return;
  122. }
  123.  
  124. ajax = SelUsuario.creaAjax()
  125. if (ajax==null) {
  126. alert ("Tu navegador no soporta Ajax");
  127. return;
  128. }
  129.  
  130. var url="SelecUsuarios.php?q="+escape(str);
  131. ajax.open("GET",url,true);
  132. ajax.onreadystatechange = function () {
  133. var PosElemento = SelUsuario.PosicionAbsolutaElemento(elTxtBox);
  134. var posicionInicialLeft = parseInt(PosElemento.left);
  135. var posicionInicialTop = parseInt(PosElemento.top);
  136.  
  137. if (ajax.readyState==1 || ajax.readyState==2 || ajax.readyState==3) {
  138. elDiv.innerHTML = "<p align='center'><img src='precarga.gif' border='0px' widht='15px' height='15px'/></p>";
  139. elDiv.style.display= "block";
  140. }
  141.  
  142. else if (ajax.readyState==4) {
  143. if (ajax.status==200) {
  144. elDiv.innerHTML = unescape(ajax.responseText);
  145. }else {
  146. elDiv.innerHTML = "<p>Se ha producido un error</p>";
  147. }
  148. if (elDiv.style.display == "none")  elDiv.style.display= "block";
  149. }
  150. SelUsuario.Desplieaga(posicionInicialLeft, posicionInicialTop);
  151. }
  152. ajax.send(null);
  153.  return
  154. }
  155. },
  156.  
  157. Seleccionar: function () {
  158. var opt = SelUsuario.captura_objeto('contenedorOpt').getElementsByTagName('DIV');
  159. for (var i = 0; i < opt.length; i++) {
  160. SelUsuario.Evento(opt[i], 'click', function() {
  161. SelUsuario.Pegar(this.id);
  162. })  
  163. SelUsuario.Evento(opt[i], 'mouseover',  function() {
  164. SelUsuario.Marcar(this.id);
  165. })
  166. }
  167. },
  168.  
  169.  
  170. Pegar: function (valor) {
  171. var elDiv = SelUsuario.captura_objeto('contenedorOpt')
  172.    SelUsuario.captura_objeto(TxtId).value = valor;
  173.            if (elDiv.style.display == "block"); elDiv.style.display= "none";        
  174. },
  175.  
  176.  
  177. Marcar: function (valor) {
  178. var selecionado = SelUsuario.captura_objeto(valor);
  179. var opt = SelUsuario.captura_objeto('contenedorOpt').getElementsByTagName('DIV');
  180. for (var i = 0; i < opt.length; i++) {
  181. if (opt[i].className == "seleccionado") {
  182. opt[i].className = "deseleccionado";
  183. selecionado.className = "seleccionado";
  184. break;
  185. }
  186.    }
  187. },
  188.  
  189.  
  190. Pegar2: function (ev) {
  191. var elDiv = SelUsuario.captura_objeto('contenedorOpt')
  192. var opt = elDiv.getElementsByTagName('DIV');
  193. var keyCode = document.layers ? ev.which : document.all ? event.keyCode : document.getElementById ? ev.keyCode : 0;
  194.  
  195. if ((keyCode == 13) || (keyCode == 9)) {
  196. for (var i = 0; i <= opt.length-1; i++) {
  197. if (opt[i].className == "seleccionado") {
  198. SelUsuario.captura_objeto(this.id).value = opt[i].id;
  199. if (elDiv.style.display == "block"); elDiv.style.display= "none";
  200. break;
  201. }
  202. }
  203.  
  204. if (keyCode == 13) {
  205. try{
  206. ev.preventDefault();
  207. }catch(e){
  208. ev.returnValue = false;
  209.        }
  210.    }
  211.    }    
  212. },
  213.  
  214. BajaOpt: function() {
  215. var opt = SelUsuario.captura_objeto('contenedorOpt').getElementsByTagName('DIV');
  216.    for (var i = 0; i <= opt.length-1; i++) {
  217. if (opt[i].className == "seleccionado") {
  218. opt[i].className = "deseleccionado";
  219. if (i < opt.length-1){
  220. i++;
  221. }else{
  222. i = 0;
  223. }
  224. opt[i].className = "seleccionado"
  225. }
  226. }
  227. },
  228.  
  229.  
  230. SubeOpt: function() {
  231. var opt = SelUsuario.captura_objeto('contenedorOpt').getElementsByTagName('DIV');
  232. for (var i = 0; i <= opt.length-1; i++) {
  233. if (opt[i].className == "seleccionado") {
  234. opt[i].className = "deseleccionado";
  235. if (i < opt.length && i > 0){
  236.  i--;
  237. }else{
  238.  i = opt.length-1;
  239. }
  240. opt[i].className = "seleccionado"
  241. }
  242. }
  243. },
  244.  
  245.  
  246. Cerrar: function () {
  247. setTimeout("var elDiv = SelUsuario.captura_objeto('contenedorOpt'); if (elDiv.style.display == 'block'); elDiv.style.display= 'none';", 1000);
  248. }
  249. }
  250. SelUsuario.Evento(window, 'load', SelUsuario.init);
  251. </script>
  252. </head>
  253. <table border="1" id="idt_1">
  254. <tr><td>Nombre Usuario: <input type="text" name="txt" id="txt1" value="" autocomplete="off"></td></tr>
  255.  </table>
  256. <table border="1" id="idt_2">
  257. <tr><td>Nombre Usuario: <input type="text" name="txt" id="txt2" value="" autocomplete="off"></td></tr>
  258.  </table>
  259. <div id="contenedorOpt" class="capa" style="display:none;"></div>
  260. </body>
  261. </html>

Archivo selecUsuarios.php

Código PHP:
Ver original
  1. <?php
  2. $usuario = $_GET['q'];
  3.  
  4. if (strlen($usuario) >= 2) {
  5.    
  6.     include "../conexion.php";
  7.  
  8.     $sql = "SELECT Nombre FROM CrmContactos WHERE Nombre LIKE '".$usuario."%' ORDER BY Nombre asc";
  9.     $result = mysql_query($sql);
  10.     $nReg= mysql_num_rows($result);
  11.     $contador=1;
  12.    
  13.     if($row = mysql_fetch_array($result)){
  14.    
  15.         do {
  16.             if($contador == 0){  
  17.                 echo  '<div id="'.$row['Nombre'].'" class="seleccionado">' .ResaltarSubStr($row['Nombre'], $usuario). '</div>';
  18.             } else {
  19.                 echo  '<div id="'.$row['Nombre'].'" class="">' .ResaltarSubStr($row['Nombre'], $usuario). '</div>';
  20.             }
  21.             $contador += 1;
  22.         } while ($row = mysql_fetch_array($result));
  23.    
  24.     }else{
  25.         echo '<p class="deseleccionado"><strong>Sin resultados</strong></p>';
  26.     }
  27. }
  28.  
  29.  
  30.  
  31.     // ========= Funciones ===========
  32.     function ResaltarSubStr($texto, $usuario) {
  33.         $patron = "/\b($usuario)+(\w)/";
  34.         $marca = preg_replace($patron, "<strong>$1</strong>$2", $texto);
  35.         //$marca = $usuario;
  36.         return $marca;
  37.     }
  38.     // ========= Fin Funciones ===========
  39. ?>

Si alguien mas tiene otra propuesta sencilla como esta que funcione se lo agradeceria muchisimo!
  #4 (permalink)  
Antiguo 02/03/2011, 07:48
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Ayuda autocompletar combobox ajax

no tengo manera de probarlo, ya que el lenguaje del servidor que uso es asp. lamento no poder ayudarte

Etiquetas: ajax, combobox, autocompletado
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:33.