Javascript onkeydown событие огонь только один раз?

heylo не ребята,

Я хочу, чтобы событие onkeydown запускало функцию только один раз. чтобы эта функция снова сработала, пользователь должен отпустить клавишу и снова нажать/удерживать. Я знаю, что это довольно просто, но я новичок в JS. Также я предпочитаю избегать использования jQuery или других библиотек. еще одна вещь, это должно работать как для ie, так и для firefox.

большое спасибо!

6 ответов


вы можете установить флаг:

var fired = false;

element.onkeydown = function() {
    if(!fired) {
        fired = true;
        // do something
    }
};

element.onkeyup = function() {
    fired = false;
};

или отменить и повторно связать обработчик событий (может быть лучше):

function keyHandler() {
     this.onkeydown = null;
     // do something
}

element.onkeydown = keyHandler;

element.onkeyup = function() {
    this.onkeydown = keyHandler;
};

дополнительная информация о" традиционной " обработке событий.

вы также можете использовать addEventListener и attachEvent для привязки обработчиков событий. Для получения дополнительной информации об этом, посмотрите на quirksmode.org -расширенные модели регистрации событий.


здесь вы идете:

test.onkeydown = function() {
    if ( this.className === 'hold' ) { return false; }
    this.className = 'hold';

    // call your function here
};

test.onkeyup = function() {
    this.className = '';
};

демо: http://jsfiddle.net/simevidas/xAReL/2/


в jQuery один поможет вам.

то, что он делает, привязывает eventHandler к событию, и когда происходит событие, он запускает eventHandler и разматывает его, чтобы его не запускали при следующем событии.


вот метод, который использует addEventListener и removeEventListener

var textBox = document.getElementById("textBox");
function oneKeyDown(){
    $("body").append("<h1>KeyDown<h1>"); //just to show the keypress
    textBox.removeEventListener('keydown', oneKeyDown, false);
}
function bindKeyDown(){
  textBox.addEventListener('keydown', oneKeyDown, false);
}
textBox.addEventListener('keyup', bindKeyDown, false)   
bindKeyDown();

пример кода jsfiddle.

одно примечание, для IE вам нужно будет использовать attachEvent, detachEvent.


как указано в других ответах, нет "onkeyfirstdown" или аналогичного события для прослушивания.

лучшим решением является отслеживание того, какие ключи уже находятся в JS-объекте:

var keysdown = {};

element.addEventListener('keydown', function(evt) {
  if(!(evt.key in keysdown)) {
    keysdown[evt.key] = true;
    // key first pressed
  }
});

element.addEventListener('keyup', function(evt) {
  delete keysdown[evt.key];
});

таким образом, вы не будете пропускать события "keyfirstpressed", если удерживается несколько клавиш.

(многие другие решения, размещенные здесь, будут срабатывать только тогда, когда другие ключи не работают).


есть параметр" один раз", который вы можете использовать

https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener

например:

element.addEventListener('keyup', function(event) {  
    doSomething()
}, {once: true});

он удалит его, как только он будет вызван.

альтернативно вы можете использовать removeEventListener если это именованная функция