Categorias

Bloqueador de teclas do teclado

Existem muitos códigos para bloqueio de teclas na internet, mas esse é um pouco mais completo.

A principal idéia é ser personalizável.

/*
    Função para limitar o uso de teclas desnecessárias em certos campos.
    Não implementei a permissão dos caracteres alfabéticos, pois, o uso principal dessa função é em campos onde só se pode digitar
    números. Mais não a nada que impeça sua codificação mais tarde.
    IMPORTANTE
    A função deve ser chamada no evento ONKEYDOWN, pelo seguinte motivo:
    O IE só valida os digitos por keyCode no evento onkeydown, no evento onkeypress a validação é feita por caracter ascii.
    Com isso não possível validar por exemplo as teclas de setas, home, end, etc.
    Para termos o código dessas teclas, a função tem de ser chamada no evento onkeydown.
    Outra coisa importante, no evento onkeydown onde a validação é feita por keyCode, as teclas numéricas do teclado alfa, e do teclado numérico
    são diferentes: Por exemplo, o "1" do teclado alfa, ou seja, que está em cima do "Q", tem o código 49,
    já no teclado numérico esse código é 105.
    É por isso que quando a função era chamada no evento onkeypress, letras eram liberadas, pois nesse evento a validação é feita pelo caractere ascii, e nesse caso
    o código referente ao "1" dos dois teclados é o mesmo, 49.

    O parâmetro strPermitidas é usado para liberação de outras teclas, como por exemplo a tecla do "." e da ",".
    No evento onKeyDown de um textbox por exemplo.
    - Deve permitir números, "." e ",".
    onkeydown="javascript:PermitirCaracteres(event, true, '188,190,110,194');"
*/
function PermitirCaracteres(objEvento, blnNumeros, strPermitidas)
{
    var objFrameWork    = new LEBJSFrameWork()
    var lngCaracter     = 0;
    var strCaracter     = '';
    var blnRetorno      = false;
    var blnTeclaControl = false;
    var blnTeclaShift   = false;

    // Recuperando o keyCode da tecla.
    if(objEvento.keyCode)
    {
        lngCaracter = objEvento.keyCode;
    }
    else if(objEvento.which)
    {
        lngCaracter = objEvento.which;
    }
    else if(objEvento.charCode)
    {
        lngCaracter = objEvento.charCode;
    }
    else
    {
        lngCaracter = void(0);
    }

    // Valor booleano que indica se as teclas Shift e/ou Control estão pressionadas.
    blnTeclaControl = objEvento.ctrlKey;
    blnTeclaShift   = objEvento.shiftKey;

    // Permitir o uso de CTRL com as teclas C, V, X e A.
    strCaracter = String.fromCharCode(lngCaracter).toUpperCase();
    var objExpressaoRegular = /^[CVXA]$/;
    if(blnTeclaControl && objExpressaoRegular.test(strCaracter))
    {
        blnRetorno = true;
    }

    /*
    Permissão de teclas pré-definidas para liberdade de navegação dentro do campo:
    8 - Backspace
    9 - TAB
    45 - Insert
    46 - Delete
    36 - Home
    35 - End
    37 - Seta Esquerda
    39 - Seta Direita

    Vou validar estas teclas separadamente, pois algumas teclas requerem certas particularidades.
    O Backspace pode ser utilizado sozinho ou com em conjunto com o CTRL.
    */
    if((!blnTeclaShift) && lngCaracter == 8)
    {
        blnRetorno = true;
    }

    // O Insert e o Delete não podem ser usados em combinação com outras teclas.
    var objExpressaoRegular = /^(45|46)$/;
    if((!(blnTeclaControl || blnTeclaShift)) && objExpressaoRegular.test(lngCaracter))
    {
        blnRetorno = true;
    }

    // As outras teclas podem ser usadas sem restrições.
    var objExpressaoRegular = /^(9|35|36|37|39)$/;
    if(objExpressaoRegular.test(lngCaracter))
    {
        blnRetorno = true;
    }

    /*
    Permitir caracteres numéricos.
    O tratamento do tipo boolean:
        Permitir o acesso a função somente se o valor da variável for True.
    O tratamento de tecla Shift pressionada.
        Restringir a digitação de !@#$%¨&*().
    O tratamento da tecla CTRL pressionada.
        Restringir no IE 7 a mudança de abas.
    */
    if(blnNumeros && typeof(blnNumeros) == 'boolean')
    {
        var objExpressaoRegular = /^(4[8-9]|5[0-7]|9[6-9]|10[0-5])$/;
        if((!(blnTeclaShift || blnTeclaControl)) && objExpressaoRegular.test(lngCaracter))
        {
            blnRetorno = true;
        }
    }

    // Permitir outras teclas informadas pelo programador, como por exemplo, virgulas e pontos.
    if(!objFrameWork.pIsEmpty(strPermitidas))
    {
        strPermitidas = strPermitidas.replace(/s/g, '');
        strPermitidas = strPermitidas.replace(/^[,]|[,]$/g, '');
        if(!objFrameWork.pIsEmpty(objFrameWork.pTrim(strPermitidas)))
        {
            var arrPermitidas = strPermitidas.split(',');
            for(var i = 0; i <= arrPermitidas.length; i++)
            {
                if((!blnTeclaShift) && lngCaracter == arrPermitidas[i])
                {
                    blnRetorno = true;
                    break;
                }
            }
        }
    }

    // Caso a tecla ou combinação de teclas seja permitida, sai da função.
    if(blnRetorno)
    {
        return blnRetorno
    }

    try
    {
        objEvento.returnValue  = false;
        objEvento.cancelBubble = true;

        if(document.all)
        {
            objEvento.keyCode = 0;
        }
        else
        {
            objEvento.preventDefault();
            objEvento.stopPropagation();
        }
    }
    catch(err)
    {
    }
    return blnRetorno;
}