2009-06-16 23 views
6

Estoy frente a un problema con el tipo de texto de entrada (es decir. Cuadro de texto).Javascript cuadro de texto Evento

He escrito una función utilizada por el evento onkeyup en un cuadro de texto. La línea tiene este aspecto:

<input type='TEXT' value='abc' onkeyup='changeSomething(this);'> 

Pero ahora estoy frente a un problema que cuando el usuario selecciona los valores de los valores introducidos anteriormente, Estoy no conseguir cualquier caso cuando el usuario selecciona cualquiera de los valores introducidos anteriormente desde el menú desplegable (editar: creo que se refiere al autocompletado del navegador aquí).

¿Alguien tiene una solución para esto? :)

Respuesta

11

uso onchange en lugar de onkeyup en este caso

véase: http://www.w3schools.com/jsref/event_onchange.asp

por ejemplo

<input type='text' value='abc' onchange='changeSomething(this);' /> 

de evitar esto

EDITAR dos cosas:
1) valores de Autocompletar se pueden seleccionar utilizando las teclas de flecha y ENTER/pestaña, y mediante el uso del ratón. Las teclas de flecha/enter.tab activan los eventos onkeyup ... al hacer clic en el cuadro de autocompletar no se activa el evento onclick.
2) El evento de cambio se dispara tan pronto como se pierde el foco SI el contenido ha cambiado. El enfoque no se pierde al seleccionar valores de autocompletar.

Esencialmente, no parece haber ninguna manera de garantizar razonablemente el evento será procesada de la manera deseada.

En primer lugar, lo que realmente necesita para escuchar a cada golpe de teclado? En segundo lugar, ¿le sería más útil desactivar el autocompletar? (por ejemplo <input type='text' value='abc' autocomplete='off' onkeyup='changeSomething(this);' />)

+1

1 los acontecimientos clave son notoriamente frágiles y no se encargará de ratón copiar/pegar basado por ejemplo – annakata

+0

excelente punto. keyup/keypress son, sin embargo, muy buenos si está proporcionando una interfaz de teclado/permisible. Aparte de eso ... no es tan útil. –

+0

Lo veo de esta manera: si el evento clave en sí mismo es lo que le interesa, entonces use eventos clave. Si está interesado en el * efecto * del evento clave, use algo más. – annakata

3

he aquí una solución que sondea el elemento periódicamente para cualquier cambio

<script type="text/javascript"> 

var changeWatcher = { 
    timeout: null, 
    currentValue: '', 
    watchForChange: function(el) { 
     if(el.value != this.currentValue) { 
      this.changed(el); 
     } 
     this.timeout = setTimeout(function() { 
      changeWatcher.watchForChange(el) 
     }, 200); 
    }, 
    cancelWatchForChange: function() { 
     clearTimeout(this.timeout); 
     this.timeout = null; 
    }, 
    changed: function(el) { 
     this.currentValue = el.value; 
     // do something with the element and/or it's value 
     //console.log(el.value); 
    } 
} 

</script> 
<input type='text' value='abc' onfocus='changeWatcher.watchForChange(this)' onblur='changeWatcher.cancelWatchForChange()' onchange='changeWatcher.changed(this)' /> 
+0

No recibimos ninguno de los eventos en este caso ... Así que esto no funcionará ... lo siento por eso ... –

Cuestiones relacionadas