Ver Mensaje Individual
  #3 (permalink)  
Antiguo 01/03/2011, 16:44
ensendedor
 
Fecha de Ingreso: marzo-2011
Mensajes: 2
Antigüedad: 13 años, 9 meses
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!