Javascript onkeydown событие срабатывает только один раз? - PullRequest
8 голосов
/ 18 марта 2011

Привет, ребята,

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

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

Ответы [ 6 ]

20 голосов
/ 18 марта 2011

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

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 - Расширенные модели регистрации событий .

2 голосов
/ 18 марта 2011

Вот, пожалуйста,

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/

1 голос
/ 18 марта 2011

Вот метод, который использует 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.

0 голосов
/ 17 мая 2018

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

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

Например:

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

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

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

0 голосов
/ 11 ноября 2016

, как указано в других ответах, нет никакого 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', если удерживается более одной клавиши.

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

0 голосов
/ 18 марта 2011

JQuery's one поможет вам.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...