De acuerdo a esta documentacion:
Estos eventos se generan cuando el usuario presiona las teclas.
El evento onKeyDown sucede cuando el usuario pulsa una tecla.
El evento onKeyUp tiene lugar cuando el usuario deja de pulsar una tecla.
El evento onKeyPress se genera cuando se mantiene pulsada una tecla.
Si lo que necesitas es asociar un evento para cuando presionas una tecla, lo que deberias usar es onKeyDown(), ya que este es el que se ejecuta cuando se presiona una tecla, mas no cuando se mantiene presionada.
Podrias hacer algo como esto:
addEvent(document, "keydown", function (e) {
console.log("Se presiono una tecla");
});
function addEvent(element, eventName, callback) {
if (element.addEventListener) {
element.addEventListener(eventName, callback, false);
} else if (element.attachEvent) {
element.attachEvent("on" + eventName, callback);
} else {
element["on" + eventName] = callback;
}
}
onKeyUp() se ejecutara cuando la tecla se "libere", es decir cuando el usuario deje de presionarla. Como por ejemplo:
function cambiaMayuscula(elemento){
elemento.value = elemento.value.toUpperCase();
}
<input type="text" onkeyup="cambiaMayuscula(this)" placeholder="Escribe algo...">
Mira lo que ocurre ahora si usamos onKeyDown(), escribe algo en la caja de texto:
function cambiaMayuscula(elemento){
elemento.value = elemento.value.toUpperCase();
}
<input type="text" onkeydown="cambiaMayuscula(this)" placeholder="Escribe algo...">
En esta funcion convertimos el texto escrito por el usuario a
MAYUSCULA, pero mira lo que pasa cuando escribes.
De acuerdo a lo que me indicas en los comentarios (que solo se ejecute una vez), creo que podrias usar algo como esto:
var teclaPresionada = false;
addEvent(document, "keydown", function (e) {
if(!teclaPresionada){
console.log("Tecla Presionada");
teclaPresionada = true;
}
});
addEvent(document, "keyup", function (e) {
if(teclaPresionada){
console.log("Tecla Liberada");
teclaPresionada = false;
}
});
function addEvent(element, eventName, callback) {
if (element.addEventListener) {
element.addEventListener(eventName, callback, false);
} else if (element.attachEvent) {
element.attachEvent("on" + eventName, callback);
} else {
element["on" + eventName] = callback;
}
}