Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Обработка нажатия двух клавиш одновременно. (https://javascript.ru/forum/events/78148-obrabotka-nazhatiya-dvukh-klavish-odnovremenno.html)

Temcher 03.08.2019 21:32

Не понятна строка с if
var pressedKeys = {};

onkeydown = function(e) {
	if(e.code in pressedKeys) return;
	pressedKeys[e.code] = true;
};

Сначала мы создали пустой объект pressedKeys, потом событие onkeydown. Если(код клавиши в объекте) вернуть; Эта строка проверяет есть ли код клавиши в объекте? Так ведь объект изначально пустой. не понимаю. (Сам оператор if мне понятен)

рони 03.08.2019 21:46

Temcher,
если код клавиши записан, то не записывать его снова и снова и снова и снова и снова ... onkeydown это пулемёт :)

Aetae 03.08.2019 22:09

Malleys, зачем извращаться с bind если в api изначально заложена функциональность именно для такого случая:
function PressedKeysRegistry() {}
PressedKeysRegistry.prototype = {
	constructor: PressedKeysRegistry,
	start: function() {
		addEventListener("keydown", this);
		addEventListener("keyup", this);
	},
	stop: function() {
		removeEventListener("keydown", this);
		removeEventListener("keyup", this);
	},
	handleEvent: function(event) {
		if(event.type === "keydown") {
			if(this[event.code]) return;
			this[event.code] = true;
		} else if(event.type === "keyup") {
			delete this[event.code];
		}
	}
};

рони 03.08.2019 22:23

Aetae,
:thanks:

j0hnik 04.08.2019 00:55

Цитата:

Сообщение от рони
если код клавиши записан, то не записывать его снова и снова и снова и снова и снова ... onkeydown это пулемёт

хотя сама проверка тут более тяжелая операция чем постоянная перезапись объекта.

рони 04.08.2019 01:04

j0hnik,
на всякий случай ... код изначально был из примера
Цитата:

onkeydown = function(e) {
if(pressedKeys[e.code]) return;
pressedKeys[e.code] = true;

if(e.code === "KeyW") {
console.log('Кнопка W нажата');
} else if(e.code === "KeyD") {
console.log('Кнопка D нажата');
}
}
как иначе вывести, только один раз сообщение, что клавиша нажата?

j0hnik 04.08.2019 01:10

Цитата:

Сообщение от рони
как иначе вывести, только один раз сообщение, что клавиша нажата?

С проверкой :)
pressedKeys[e.code] = true;

а тут можно и без


Часовой пояс GMT +3, время: 23:01.