javascript limite de caracteres de entrada de texto

Estou querendo restringir os caracteres de entrada de uma caixa de texto para [a-z0-9_-]. No entanto, sempre que isso acontecer, botões como backspace e as teclas de seta não funcionam. Encontrei algumas tentativas neste site e em outros, mas eles não funcionam corretamente em todos os navegadores ou usam uma lista negra. Por exemplo, o Exemplo do site W3Schools números da lista negra. Existe uma maneira de usar a lista branca (a acima) e ainda permitir teclas como backspace, setas, home, end etc? Ou tenho que adicionar todos os códigos de chave que correspondem às chaves que eu quero permitir? Eu faço algo assim (isso é reduzido para simplificar).

EDITA - Adicionado código

 <input type="text" onkeypress="return checkInput();">
    function checkInput(){
        return /[a-z0-9_-]/gi.test(String.fromCharCode(window.event.keyCode));
    }

Obrigad

questionAnswers(5)

yourAnswerToTheQuestion