Foros del Web » Programando para Internet » Javascript »

Como seleccionar un elemento de una lista desplegable con teclado?

Estas en el tema de Como seleccionar un elemento de una lista desplegable con teclado? en el foro de Javascript en Foros del Web. Buenas, estoy integrnado un sistema de autocomplete en un buscador, pero me encuentro con el siguiente problema, una vez que se me muestran en la ...
  #1 (permalink)  
Antiguo 20/06/2009, 10:49
 
Fecha de Ingreso: julio-2008
Mensajes: 31
Antigüedad: 15 años, 9 meses
Puntos: 0
Como seleccionar un elemento de una lista desplegable con teclado?

Buenas, estoy integrnado un sistema de autocomplete en un buscador, pero me encuentro con el siguiente problema, una vez que se me muestran en la lista deplegables los elementos solo me deja seleccionarlos con el raton, y no me deja navegar a traves de ellos con el teclado (arriba y abajo), ademas, me gustaría tambien saber como puedo hacer que se deje de mostrrar la lista cuando clickeo en cualquier lado que no sea la lista. Un saludo y gracias.
  #2 (permalink)  
Antiguo 20/06/2009, 12:56
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 4 meses
Puntos: 126
Respuesta: Como seleccionar un elemento de una lista desplegable con teclado?

Hola

Supongo la lista que se despliega está contenida en un div, así que no puede moverte por las distintas opciones. En cuanto a ocultar la lista, has de usar el evento onblur asociado a una función

Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #3 (permalink)  
Antiguo 20/06/2009, 16:08
 
Fecha de Ingreso: julio-2008
Mensajes: 31
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Como seleccionar un elemento de una lista desplegable con teclado?

Cita:
Iniciado por Adler Ver Mensaje
Hola

Supongo la lista que se despliega está contenida en un div, así que no puede moverte por las distintas opciones. En cuanto a ocultar la lista, has de usar el evento onblur asociado a una función

Suerte
Si que se muestra en un div... entonces si se encuentra en un div no hay manera de moverse por ellas? hay alguna solucion que me permita moverme con la teclas de direccion?
Y donde debo de usar el evento onblur?
  #4 (permalink)  
Antiguo 21/06/2009, 12:43
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 4 meses
Puntos: 126
Respuesta: Como seleccionar un elemento de una lista desplegable con teclado?

Hola

Tendrías que usar un select.
Onblur lo puedes usar, por ejemplo, en el body

<body onblur="funcion()">

Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #5 (permalink)  
Antiguo 21/06/2009, 12:57
 
Fecha de Ingreso: julio-2008
Mensajes: 31
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Como seleccionar un elemento de una lista desplegable con teclado?

lo acabo de poner, pero el problema es que ahora, cuando voy a seleccionar con el raton uno de los elementos del div, no me lo copia a la caja de texto...porque se activa el onblur al clicker fuera del input del texto... no se si me explico..
gracias de todas formas
  #6 (permalink)  
Antiguo 22/06/2009, 04:38
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 4 meses
Puntos: 126
Respuesta: Como seleccionar un elemento de una lista desplegable con teclado?

Hola

Muestra la función que estás usando

Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #7 (permalink)  
Antiguo 22/06/2009, 06:22
 
Fecha de Ingreso: julio-2008
Mensajes: 31
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Como seleccionar un elemento de una lista desplegable con teclado?

Estas son las funciones que he usado:
Este es el formularo donde se muestra el input donde escribe el usuario y se debe de mostrar el autocomplete en el div.
Código HTML:
 <form name="formasigpriv" method="post">
	<table width="85%" align="center">
	  <tr height="60">
	    <td class="impacto"><?php echo htmlentities(USUARIO) ?>:</td>
		<td><input type="text" id="usuario" name="usuario" size="50" onblur="ocultarautocomplete()" onKeyUp="autocompletar()"><div id="autocomplete"></div></td>
	  </tr>
	  <tr height="60">
	    <td class="impacto"><?php echo htmlentities(TIPOPRIV) ?>:</td>
		<td>
		  <select name="tipopriv" id="tipopriv">
		  <?php
                   ......relleno el select... 
		  ?>
		  </select>
		</td>
	  </tr>
	  <tr><td>&nbsp;</td></tr>
	  <tr>
	    <td colspan="2" align="center"><input type="button" class="btn" onmouseover="this.className='btn btnhov'" onmouseout="this.className='btn'"   value="<?php echo htmlentities(ASIGPRIV) ?>" onClick="asignarPrivilegios()"></td>
	  </tr>
	</table>
  </form> 
Esta es la funcion php que recupera de la base de datos y escribe en el div
Código PHP:
        include("../cabecera.php");
    
$texto $_POST["texto"];
    
$crit $_POST["crit"];
    if (
$crit == "apellidos")
        
$query "SELECT usuario AS salida FROM usuarios WHERE usuario LIKE '"utf8_decode($_POST["texto"]) . "%'";
    else
        
$query "SELECT CONCAT(apellidos, ', ', nombre) AS salida FROM usuarios WHERE CONCAT(apellidos, ', ', nombre) LIKE '" utf8_decode($_POST["texto"]) . "%'";
    
$resultado mysql_query ($query);
    while (
$fila mysql_fetch_array($resultado))
        echo 
"<div><a href='javascript:completarNombre(\"" htmlentities($fila["salida"]) . "\")'>" htmlentities($fila["salida"]) . "</a></div>\n"
esta son las funciones javascrip que trabajan para el autocomplete, la primera oculta el div, la segunda realiza la a peticion a la base de datos, la otra lo coloca en el sitio correcto y la ultima es para cuando hagamos click en el rato en alguno de los datos del div se copie al input.
Código:
function ocultarautocomplete(){
	var comp = document.getElementById('autocomplete');
	comp.style.visibility = "hidden";
}

function autocompletar()
{
	var comp = document.getElementById('autocomplete');
	var textbox = document.getElementById('usuario');
	if (document.getElementById('buscarporape').checked == true)
		var crit = "usuario";
	else
		var crit = "apellidos";

	if (textbox.value == ""){
		comp.style.visibility = "hidden";
	} 
	else {
		colocarAutocomplete();
		var ajax = nuevoAjax();
		ajax.open("POST","auxi/autocomplete.php",true);
		ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		ajax.onreadystatechange = function() {
			if (ajax.readyState == 4){
				if (ajax.responseText == "")
					comp.style.visibility = "hidden";
				else{
					comp.innerHTML = ajax.responseText;
					comp.style.visibility = "visible";
				}
			}
		}
		ajax.send("texto=" + textbox.value + "&crit=" + crit);
	}
}

function colocarAutocomplete(){
	var comp = document.getElementById('autocomplete');
	var textbox = document.getElementById('usuario');
	var oNode = textbox;
	var iLeft = 0;
	var iTop = 0;
	while(oNode.tagName != "BODY") {
		iLeft += oNode.offsetLeft;
		iTop += oNode.offsetTop;
		oNode = oNode.offsetParent;
	}
	comp.style.left = iLeft;
	comp.style.top = iTop + textbox.offsetHeight;
	comp.style.width = textbox.offsetWidth;
}

function completarNombre(nombre){
	var comp = document.getElementById('autocomplete');
	var textbox = document.getElementById('usuario');
	textbox.value = nombre;  
	comp.style.visibility = "hidden";
}
Siento la parrafada, seguro que hay formas mas elegantes de hacerlo, pero...
Muchas gracias, te agradezco la ayuda!!
  #8 (permalink)  
Antiguo 22/06/2009, 07:53
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 4 meses
Puntos: 126
Respuesta: Como seleccionar un elemento de una lista desplegable con teclado?

Hola

Quita el evento onblur y en la función completarNombre
Código javascript:
Ver original
  1. function completarNombre(nombre){
  2.     var comp = document.getElementById('autocomplete');
  3.     var textbox = document.getElementById('usuario');
  4.     textbox.value = nombre;  
  5.    
  6. if (comp.style.visibility == "hidden")  comp.style.visibility= "visible";
  7.                 else comp.style.visibility= "hidden";
  8. }


Por otro lado, aquí cambia a esto

Código html:
Ver original
  1. <div id="autocomplete" style="visibility:hidden;"></div>
Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #9 (permalink)  
Antiguo 22/06/2009, 10:07
 
Fecha de Ingreso: julio-2008
Mensajes: 31
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Como seleccionar un elemento de una lista desplegable con teclado?

Buenas, Adler gracias por t u ayuda, pero te comento...
[IMG]img194.imageshack.us/img194/2608/dibujodiw.png[/IMG]
A escribir ves como me sale en el div los nombres que coincidem, pues lo que quiero es que por ejemplo sin no hago click con el raton en alguno de ellos, es decir fuera del div que se me oculte la lista desplegable, y con lo que me has comentado no se oculta. La verdad no se si se puede hacer, creo que si, pero te dejo la imagen por si se te puede ocurrir algo. Ahora mismo tal y como esta, solo te deja o elegir alguno de los que salen, copiandose perfectamte al input, o esperara a que al escribir no de ninguna coincidencia...no se si me explico...
Gracias de nuevo
  #10 (permalink)  
Antiguo 22/06/2009, 12:47
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 4 meses
Puntos: 126
Respuesta: Como seleccionar un elemento de una lista desplegable con teclado?

Hola

Lo que pretendes hacer no se puede. El foco está en el campo usuario. En cuanto lo pierda, el div desaparecería, de forma que cuando se intentara seleccionar una de las opciones, no se escribiría en el text.

Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #11 (permalink)  
Antiguo 22/06/2009, 12:54
 
Fecha de Ingreso: julio-2008
Mensajes: 31
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Como seleccionar un elemento de una lista desplegable con teclado?

Cita:
Iniciado por Adler Ver Mensaje
Hola

Lo que pretendes hacer no se puede. El foco está en el campo usuario. En cuanto lo pierda, el div desaparecería, de forma que cuando se intentara seleccionar una de las opciones, no se escribiría en el text.

Suerte
Gracias adler, no podría hacerse de otra manera aunque tuviera que cambiar algo? me dijistes que usando un select en vez de un div, podríamos movernos con la teclas de direccion, no se....es que creo que intente algo asi y no se me mostraba donde deseaba...ya me contaras si hay alguna solucion..
  #12 (permalink)  
Antiguo 22/06/2009, 13:18
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 4 meses
Puntos: 126
Respuesta: Como seleccionar un elemento de una lista desplegable con teclado?

Hola

Pensandolo mejor, dejame investigar un poco el caso que nos ocupaba anteriormente
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #13 (permalink)  
Antiguo 22/06/2009, 13:34
 
Fecha de Ingreso: julio-2008
Mensajes: 31
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Como seleccionar un elemento de una lista desplegable con teclado?

Ok, Alder, ya me cuentas! gracias!
  #14 (permalink)  
Antiguo 02/07/2009, 06:15
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 4 meses
Puntos: 126
Respuesta: Como seleccionar un elemento de una lista desplegable con teclado?

Hola

Veamos ....

Tendrás que pasar javascript, así que necesitarás mandar llamar, de forma externa, a este guión con la extensión .js

Código javascript:
Ver original
  1. var tagScript = '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)';
  2. /**
  3. * Eval script fragment
  4. * @return String
  5. */
  6. String.prototype.evalScript = function()
  7. {
  8.         return (this.match(new RegExp(tagScript, 'img')) || []).evalScript();
  9. };
  10. /**
  11. * strip script fragment
  12. * @return String
  13. */
  14. String.prototype.stripScript = function()
  15. {
  16.         return this.replace(new RegExp(tagScript, 'img'), '');
  17. };
  18. /**
  19. * extract script fragment
  20. * @return String
  21. */
  22. String.prototype.extractScript = function()
  23. {
  24.         var matchAll = new RegExp(tagScript, 'img');
  25.         return (this.match(matchAll) || []);
  26. };
  27. /**
  28. * Eval scripts
  29. * @return String
  30. */
  31. Array.prototype.evalScript = function(extracted)
  32. {
  33.                 var s=this.map(function(sr){
  34.                 var sc=(sr.match(new RegExp(tagScript, 'im')) || ['', ''])[1];
  35.                 if(window.execScript){
  36.                 window.execScript(sc);
  37.                 }
  38.                 else
  39.                 {
  40.                  window.setTimeout(sc,0);
  41.                 }
  42.                 });
  43.                 return true;
  44. };
  45. /**
  46. * Map array elements
  47. * @param {Function} fun
  48. * @return Function
  49. */
  50. Array.prototype.map = function(fun)
  51. {
  52.         if(typeof fun!=="function"){return false;}
  53.         var i = 0, l = this.length;
  54.         for(i=0;i<l;i++)
  55.         {
  56.                 fun(this[i]);
  57.         }
  58.         return true;
  59. };


por otro lado, en principio no te va a funcionar por que está interviniendo un checkbox o radio. Modifica lo que sea necesario hasta adaptarlo a lo que te ocupa

Código javascript:
Ver original
  1. function completarNombre(nombre){
  2.     var comp = document.getElementById('autocomplete');
  3.     var textbox = document.getElementById('usuario');
  4.     textbox.value = nombre;  
  5.     comp.style.display= "none";
  6. }
  7.  
  8.  
  9.  
  10. function ocultarautocomplete(){
  11.     var comp = document.getElementById('autocomplete');
  12.     comp.style..display= "none";   
  13. }
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20. function autocompletar()
  21. {
  22.     var comp = document.getElementById('autocomplete');
  23.     var textbox = document.getElementById('usuario');
  24.     if (document.getElementById('buscarporape').checked == true)
  25.         var crit = "usuario";
  26.     else
  27.         var crit = "apellidos";
  28.  
  29.     if (textbox.value == ""){
  30.         comp.style.visibility = "hidden";
  31.     }
  32.     else {
  33.         colocarAutocomplete();
  34.         var ajax = nuevoAjax();
  35.         ajax.open("POST","auxi/autocomplete.php",true);
  36.         ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  37.         ajax.onreadystatechange = function() {
  38.             if (ajax.readyState == 4){
  39.                 var scs=ajax.responseText.extractScript();
  40.                     comp.innerHTML = ajax.responseText.stripScript();
  41.                 scs.evalScript();
  42.  
  43.             }
  44.         }
  45.         ajax.send("texto=" + textbox.value + "&crit=" + crit);
  46.     }
  47. }
  48.  
  49. function colocarAutocomplete(){
  50.     var comp = document.getElementById('autocomplete');
  51.     var textbox = document.getElementById('usuario');
  52.     var oNode = textbox;
  53.     var iLeft = 0;
  54.     var iTop = 0;
  55.     while(oNode.tagName != "BODY") {
  56.         iLeft += oNode.offsetLeft;
  57.         iTop += oNode.offsetTop;
  58.         oNode = oNode.offsetParent;
  59.     }
  60.     comp.style.left = iLeft;
  61.     comp.style.top = iTop + textbox.offsetHeight;
  62.     comp.style.width = textbox.offsetWidth;
  63. }
  64.  
  65.  
  66.  
  67.  
  68. function Evento(elemento,nomevento,funcion) {
  69.   if (elemento.attachEvent)
  70.   {
  71.       var f=function(){
  72.         funcion.call(elemento,window.event);
  73.     }
  74.     elemento.attachEvent('on'+nomevento,f);
  75.     return true;
  76.   }
  77.   else  
  78.     if (elemento.addEventListener)
  79.     {
  80.       elemento.addEventListener(nomevento,funcion,false);
  81.       return true;
  82.     }
  83.     else
  84.       return false;
  85. }
  86.  
  87.  
  88. window.onload = function () {
  89. var elemento = document.getElementById('autocomplete');
  90. var elementoDIV = document.getElementById('usuario');
  91.  
  92.    
  93.     elemento.onkeyup = function() {
  94.         autocompletar(elemento.value);
  95.         }
  96.  
  97.     window.onclick = function () {
  98.         ocultarautocomplete();
  99.         }
  100.  
  101. }

en la petición has de incluir algo como

Código javascript:
Ver original
  1. <script type="tex/javascript">
  2. var ref = document.getElementById('usuario').getElementsByTagName('nombredelelemento');
  3. for (var i = 0; i < ref.length; i++) {
  4.   Evento(ref[i], 'click', function() {
  5.       completarNombre(this.id);
  6. })    
  7. }
  8. </script>

alguna duda, ya sabes ....

Suerte
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #15 (permalink)  
Antiguo 02/07/2009, 06:24
 
Fecha de Ingreso: julio-2008
Mensajes: 31
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Como seleccionar un elemento de una lista desplegable con teclado?

Me acabas de acojonar
Voy a probar a ver, lo del check radio, ya lo he quitado, asi que voy a ver como puedo poner esto, porque de un primer vistazo no se como meterle mano...
Muchisimas gracias por tu ayuda!!
  #16 (permalink)  
Antiguo 02/07/2009, 12:48
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 4 meses
Puntos: 126
Respuesta: Como seleccionar un elemento de una lista desplegable con teclado?

Cita:
Iniciado por Ayuso Ver Mensaje
Me acabas de acojonar
Voy a probar a ver, lo del check radio, ya lo he quitado, asi que voy a ver como puedo poner esto, porque de un primer vistazo no se como meterle mano...
Muchisimas gracias por tu ayuda!!
Tranquilo es mas fácil de lo que puede parecer
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
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:16.