cómo capturar repeticiones clave con javascript [duplicado]
-
23-09-2019 - |
Pregunta
Esta pregunta ya tiene respuesta aquí:
Tengo un formulario asp.net y un cuadro de texto asp:.Tengo un problema cuando el usuario presiona y MANTIENE presionada una tecla.el usuario selecciona el cuadro de texto y luego presiona y mantiene presionado '9' hasta que el cuadro de texto se llena con 9.
¿Hay alguna manera de detectar esta situación?¿Hay alguna manera de detener las repeticiones de teclas cuando se mantiene presionada la tecla?
Solución
Usando jquery, podrías hacer algo como esto:
<script type="text/javascript">
var allowKey = true;
$(function () {
$("#one").keydown(function (e) {
if (!allowKey) {
e.preventDefault();
}
allowKey = false;
});
$("#one").keyup(function () {
allowKey = true;
});
});
</script>
<input id="one" />
CORRECCIÓN DE ERRORES ACTUALIZADOS:
var keyCount = 0;
$(function () {
$("#one").keypress(function (e) {
if (keyCount > 1) {
e.preventDefault();
}
keyCount++;
});
$("#one").keyup(function () {
keyCount = 0;
});
});
Otros consejos
A continuación se previene las teclas Autorepreadas para las teclas "normales" (es decir, las que generan entrada de texto), incluso cuando se presionan varias teclas simultáneamente. Tenga en cuenta que el keypress
El evento es el único evento que seguramente se disparará en todos los navegadores convencionales para los Autorepeats y el keyCode
valor para un keydown
El evento no será el mismo que el charCode
/ which
valor para el correspondiente keypress
evento, lo que complica un poco las cosas.
Manifestación: http://jsfiddle.net/krj5m/
Código:
var textBox = document.getElementById("my_textbox");
var lastKeyDown, keyIsPressed = {}, keyCodeForCharCode = {},
charCodeForKeyCode = {};
textBox.onkeydown = function(evt) {
evt = evt || window.event;
lastKeyDown = evt.keyCode;
};
textBox.onkeyup = function(evt) {
evt = evt || window.event;
var charCode = charCodeForKeyCode[evt.keyCode];
if (charCode) {
keyIsPressed[charCode] = false;
}
};
textBox.onkeypress = function(evt) {
evt = evt || window.event;
var keyCode, charCode = evt.which || evt.keyCode;
if (keyIsPressed[charCode]) {
// This keypress is an autorepeat
return false;
} else {
keyIsPressed[charCode] = true;
// Get the key code for the corresponding keydown event
keyCode = keyCodeForCharCode[charCode];
if (!keyCode) {
// Create two-way mapping for keyCode and charCode
keyCodeForCharCode[charCode] = lastKeyDown;
charCodeForKeyCode[lastKeyDown] = charCode;
}
}
};
Usando el controlador de eventos de Yui, podrías hacer algo como esto
var count = 0;
var kl = new YAHOO.util.KeyListener(document,{keys:27},
{
fn:function(e){
if (count > 9){
YAHOO.util.Event.preventDefault(e);
// call a function here to do something
}
else count++;
}
);
Eso haría el truco, luego, una vez que haya realizado su acción, asegúrese de que el recuento se retrase a 0.
Aquí está el enlace al ejemplo http://developer.yahoo.com/yui/examples/container/keylistener.html
Este es un ejemplo simple de cómo bloquearía la repetición de llave con JavaScript simple:
var lock = false;
document.onkeyup = onKeyUpHandler;
document.onkeypress = onKeyPressHandler;
function onKeyUpHandler() {
lock = false;
}
function onKeyPressHandler(e) {
if (!e)
e = window.event;
var code = e.keyCode || e.which;
if (lock != false) {
e.returnValue = false;
if (e.preventDefault) {
e.preventDefault();
}
}
lock = true;
}