2008-10-20 7 views
6

Necesito cambiar en un ingreso de texto el carácter '.' a ',' mientras tipea. En IE cambio la propiedad de evento código clave en el evento de pulsación de tecla, como esteCómo cambiar los caracteres escritos en Firefox

document.getElementById('mytext').onkeypress = 
function (evt) { 
    var e = evt || window.event; 
    if (e.keyCode && e.keyCode==46) 
    e.keyCode = 44; 
    else if (e.which && e.which==46) { 
    e.which = 44; 
    } 
}; 

pero seemes que en Firefox es imposible cambiar los caracteres escritos en eventos clave. ¿Alguna sugerencia?

+1

¿Por qué quieres esto? Para mí, como usuario, me sentiría un poco extraño incluso si escribo '.' mostraría ',' en el campo de entrada. Probablemente pensaría que presioné la tecla incorrecta e intentaré de nuevo. – Gene

+0

Concur. Asumiría que el navegador está yendo hacia el sur y lo reiniciaré. Cuando eso no funcionaba, comenzaba a evitar el sitio web. –

+0

A los comentadores anteriores (¡y a la próxima persona preguntándose!): Mi versión francesa de Excel lo hace para el punto del teclado numérico ...Eso es porque los franceses (y algunas otras nacionalidades) usan la coma como separador decimal, no como punto. Supongo que Pier tiene una necesidad similar. – PhiLho

Respuesta

5

Pruebe esto. Funciona en todos los navegadores:

window.onload = function() { 
    var input = document.getElementById("mytext"); 

    input.onkeypress = function() { 
     var evt = arguments[0] || event; 
     var char = String.fromCharCode(evt.which || evt.keyCode); 

     // Is it a period? 
     if (char == ".") { 
      // Replace it with a comma 
      input.value += ","; 

      // Cancel the original event 
      evt.cancelBubble = true; 
      return false; 
     } 
    } 
}; 

Actualización:Pier Luigi señaló un problema con lo anterior. No se ocupa de que la posición de intercalación no esté al final del texto. Agregará el comando hasta el final incluso si está insertando texto en el valor.

La solución sería, en lugar de agregar una coma, simular un evento de pulsación de tecla para la tecla de coma. Desafortunadamente, la forma en que el despacho de eventos sintéticos funciona en diferentes navegadores parece mostrar mucha variedad y no es una tarea fácil. Veré si puedo encontrar un método bueno y genérico para ello.

+1

su solución no se ocupa de la posición de intercalación: si el usuario escribe "." no al final del texto? –

+1

@Pier Luigi: Gracias por plantear eso. Actualizaré mi respuesta. –

1

Técnicamente, solo quiere reemplazar todos los puntos por comas.

document.getElementById('mytext').onkeyup = function(){ 
    this.value = this.value.replace('.', ','); 
} 
+0

sí funciona, pero cambia la posición de intercalación !! –

+0

Capture la posición del cursor, reemplace los caracteres, reemplace la posición del cursor. – eyelidlessness

2

Supongamos que todas las propiedades de un objeto Evento son inmutables. La especificación DOM no trata lo que sucede cuando se cambian esos valores manualmente.

Aquí tiene la lógica que necesita: escuche todos los eventos clave. Si es un período, suprime el evento y agrega manualmente la coma en la posición del cursor. (Aquí está a code snippet para insertar texto arbitrario en la posición del cursor.)

Suprimiría el evento en Firefox llamando al event.preventDefault(); esto le dice al navegador que no continúe con la acción predeterminada asociada con este evento (en este caso, escribir el carácter). Suprimiría el evento en IE configurando event.returnValue en false.

Si no es un período, regrese antes de tiempo de su controlador.

+0

gracias, funciona! Adoptaré su fragmento de código, aunque con una pequeña corrección porque en Firefox no restaura la posición de intercalación. –

0

¿Esto realmente debe hacerse sobre la marcha? Si está recopilando la información para enviarla a un formulario o enviarla a una base de datos, ¿no sería mejor modificar los datos una vez que se enviaron? De esa forma el usuario nunca ve el cambio confuso.

+0

¿No es más confuso cambiar algo después del hecho? – eyelidlessness

1

Si miro el documento oficial Document Object Model Events, los campos de eventos del mouse se definen como de solo lectura. Los eventos de teclado no están definidos allí, supongo que Mozilla siguió esta política para ellos.

Así que, básicamente, a menos que haya algún truco inteligente, no puede modificar un evento de la manera que desee. Probablemente tenga que interceptar la clave e insertar el carácter (en bruto o traducido) donde está el símbolo de intercalación, como lo hacen los editores de JS HTML.

Cuestiones relacionadas