2011-11-21 21 views
24

Estoy usando una expresión regular para quitar los caracteres no válidos de un área de entrada de texto en javascript (ejecutándose en IE). Ejecuto la función de reemplazo en cada evento de teclado. Sin embargo, esto hace que el cursor salte al final del cuadro de texto después de cada pulsación de tecla, lo que imposibilita la edición en línea.Detener el cursor de saltar al final del campo de entrada en javascript reemplazar

Aquí está en acción:

http://jsbin.com/ifufuv/2

¿Alguien sabe cómo hacer que sea lo que el cursor no ir al final del cuadro de entrada?

+2

le recomiendo que elija una mejor evento de manejar. 'onkeyup' es pobre para detectar la entrada del usuario. Ver http://whattheheadsaid.com/2010/09/effectively-detecting-user-input-in-javascript. –

+0

Aquí hay un ejemplo completo de cómo mantener la selección al reemplazar el valor de un área de texto: http://stackoverflow.com/questions/3286595/update-textarea-value-but-keep-cursor-position/3288215#3288215 –

Respuesta

10

Deberá colocar el cursor manualmente donde lo desee. Para IE9, configure .selectionStart y .selectionEnd (o use .setSelectionRange(start, end)). Para IE8 y versiones anteriores, use .createTextRange() y llame al .moveStart() en el rango de texto.

+3

W3Schools tiene un maravilloso ejemplo sobre cómo usar onkeypress para cancelar claves (en su ejemplo, cancela números, y parece ser lo suficientemente capaz de modificar la expresión regular para eliminar los caracteres que no desea). http://www.w3schools.com/jsref/event_onkeypress.asp – John

+6

@Mike: W3Schools realmente no merece personas como usted promocionando su sitio web para ellos. Eche un vistazo a http://w3fools.com: una gran cantidad de información en w3s es incorrecta o promoción de malas prácticas para los desarrolladores. Hay recursos mucho mejores en la web, como http://quirksmode.org o http://developer.mozilla.org. –

+1

No soy fanático de w3schools: http://w3fools.com/. – gilly3

15

Además de gilly3's answer, pensé que a alguien podría resultarle útil ver un fragmento de código real.

En el siguiente ejemplo, la propiedad selectionStart se recupera del elemento input antes de la manipulación de la cadena de JavaScript. Luego, selectionStart vuelve a la posición inicial después de la manipulación.

Dependiendo de lo que estamos tratando de lograr, también se puede acceder selectionEnd en lugar de selectionStart, y establecer un rango: setSelectionRange(start, end).

document.getElementById('target').addEventListener('input', function (e) { 
 
    var target = e.target, 
 
     position = target.selectionStart; // Capture initial position 
 
    
 
    target.value = target.value.replace(/\s/g, ''); // This triggers the cursor to move. 
 
    
 
    target.selectionEnd = position; // Set the cursor back to the initial position. 
 
});
<p>The method <code>.replace()</code> will move the cursor's position, but you won't notice this.</p> 
 
<input type="text" id="target" />

+1

Hice una idea rápida basada en su código con una función para refactorizar fácilmente https://gist.github.com/romuleald/f1b980d5ad01b9f525e8e0244f91711a – romuleald

Cuestiones relacionadas