Pregunta

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?

¿Fue útil?

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top