События клавиатуры

Последнее обновление: 30.10.2023

Другим распространенным типом событий являются события клавиатуры.

  • keydown: возникает при нажатии клавиши клавиатуры и длится, пока нажата клавиша

  • keyup: возникает при отпускании клавиши клавиатуры

  • keypress: возникает при нажатии клавиши клавиатуры, но после события keydown и до события keyup. Надо учитывать, что данное событие генерируется только для тех клавиш, которые формируют вывод в виде символов, например, при печати символов. Нажатия на остальные клавиши, например, на Alt, не учитываются.

Для работы с событиями клавиатуры определен объект KeyboardEvent, который добавляет к свойствам объекта Event ряд специфичных для клавиатуры свойств:

  • altKey: возвращает true, если была нажата клавиша Alt во время генерации события

  • key: возвращает символ нажатой клавиши, например, при нажатии на клавишу "T" это свойство будет содержать "T". А если нажата клавиша "Я", то это свойство будет содержать "Я"

  • code: возвращает строковое представление нажатой клавиши физической клавиатуры QWERTY, например, при нажатии на клавишу "T" это свойство будет содержать "KeyT", а при нажатии на клавишу ";" (точка запятой), то свойство возвратит "Semicolon".

    При использовании этого свойства следует учитывать ряд момент. Прежде всего используется клавиатура QWERTY. То есть мы переключим раскладку, к примеру, на русскоязычную и нажмем на клавишу "Я", то значением будет "KeyZ" - на клавиатуре QWERTY клавиша Z представляет ту же клавишу, что и на русскоязычной раскладке "Я"

    Другой момент - учитывается именно физическая клавитура. Если нажата клавиша на виртуальной клавиатуре, то возвращаемое значение будет устанавливаться браузером исходя из того, какой клавише на физической клавиатуре соответствовало нажатие.

  • ctrlKey: возвращает true, если была нажата клавиша Ctrl во время генерации события

  • metaKey: возвращает true, если была нажата во время генерации события метаклавиша клавиатуры

  • shiftKey: возвращает true, если была нажата клавиша Shift во время генерации события

Например, мы можем с помощью клавиш клавиатуры перемещать элемент на веб-странице:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>METANIT.COM</title>
	<style>
	#blueRect{
		width:100px;
		height:100px;
		background-color:blue;
	}
	</style>
</head>
<body>
<div id="blueRect"></div>

<script>
const blueRect = document.getElementById("blueRect");
// получаем стиль для blueRect
const blueRectStyle = window.getComputedStyle(blueRect);
// устанавливаем обработчик нажатия клавиши
window.addEventListener("keydown", moveRect);

function moveRect(e){
	const left = parseInt(blueRectStyle.marginLeft); //смещение от левого края
    const top = parseInt(blueRectStyle.marginTop);  // смещения от левой границы
	
	switch(e.key){
		
		case "ArrowLeft":  // если нажата клавиша влево
			if(left>0)
				blueRect.style.marginLeft = left - 10 + "px";
			break;
		case "ArrowUp":   // если нажата клавиша вверх
			if(top>0)
				blueRect.style.marginTop = top - 10 + "px";
			break;
		case "ArrowRight":   // если нажата клавиша вправо
			if(left < document.documentElement.clientWidth - 100)
				blueRect.style.marginLeft = left + 10 + "px";
			break;
		case "ArrowDown":   // если нажата клавиша вниз
			if(top < document.documentElement.clientHeight - 100)
				blueRect.style.marginTop = top + 10 + "px";
			break;
	}
}
</script>
</body>
</html>

В данном случае обрабатывается событие keydown, в обработчке которого управляем стилевыми свойствами элемента blueRect. Так как при прикреплении обработчика стиль элемента может быть не установлен, то явным образом вычисляем его с помощью метода window.getComputedStyle():

const blueRectStyle = window.getComputedStyle(blueRect);

В обработчике события из этого стиля выбираем значения свойств marginLeft и marginTop.

const left = parseInt(blueRectStyle.marginLeft); //смещение от левого края
const top = parseInt(blueRectStyle.marginTop);  // смещения от левой границы

Затем м помощью свойства e.key получаем нажатую клавишу. Список кодов клавиш клавиатуры можно посмотреть на странице https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values.

Здесь нам интересуют четыре клавиши: вверх, вниз, влево, вправо. Им соответственно будут соответствовать названия "ArrowUp", "ArrowDown", "ArrowLeft" и "ArrowRight". Если одна из них нажата, производим действия: увеличение или уменьшение отступа элемента от верхней или левой границы. Ну и чтобы элемент не выходил за границы окна, проверяем предельные значения с помощью document.documentElement.clientWidth (ширина корневого элемента) и document.documentElement.clientHeight (высота корневого элемента).

Стоит отметить, что этот код не очень оптимален, поскольку для проверки значений нам приходится вычислять положение blueRect по горизонтали и вертикали. Плюс необходимо вычислять при каждом вызове обработчика проверяем правый (document.documentElement.clientWidth - 100) и нижний край (document.documentElement.clientHeight - 100; области документа, чтобы blueRect не вышел за предел видимого пространства. В этом случае мы можем добавить дополнительные абстракции в виде текущих координат blueRect и положения правой и нижней границ видимой области. Так, изменим код JavaScript следующим образом:

const blueRect = document.getElementById("blueRect");
const position = [20, 20];	// позиция blueRect

// перемещаем blueRect на позицию в position
function setPosition() { 
	blueRect.style.marginLeft = position[0] + "px";  
	blueRect.style.marginTop = position[1] + "px";   
}

function init(){
    const rightLimit = document.documentElement.clientWidth - 100;  // правый край
    const bottomLimit = document.documentElement.clientHeight - 100;    // нижний край

    setPosition();	// устанавливаем начальную позицию для blueRect

    function moveRect(e){
        switch(e.key){
         
        case "ArrowLeft":  // если нажата клавиша влево
            if(position[0] > 0)
                position[0] = position[0] - 10;
            break;
        case "ArrowUp":   // если нажата клавиша вверх
            if(position[1] > 0)
                position[1] = position[1] - 10;
            break;
        case "ArrowRight":   // если нажата клавиша вправо
            if(position[0] < rightLimit)
                position[0] = position[0] + 10;
            break;
        case "ArrowDown":   // если нажата клавиша вниз
            if(position[1] < bottomLimit)
                position[1] = position[1] + 10;
            break;
        }
        setPosition();
    }
    window.addEventListener("keydown", moveRect);
}
//  при загрузке страницы выполняем функцию init
window.addEventListener("load", init);

Теперь координаты blueRect хранятся в массиве position, где первое значение - это отступ слева, а второе значение - отступ сверху. Чтобы по этим координатам установить реальную позицию blueRect на странице определена функция setPosition.

const position = [20, 20];	// позиция blueRect

// перемещаем blueRect на позицию в position
function setPosition() { 
	blueRect.style.marginLeft = position[0] + "px";  
	blueRect.style.marginTop = position[1] + "px";   
}

Прикрепляем к событию загрузки окна - load обработчик - функцию init:

window.addEventListener("load", init);

В функции init определяем правый и нижний край для перемещения blueRect, а также устанавливаем его начальную позицию:

const rightLimit = document.documentElement.clientWidth - 100;  // правый край
const bottomLimit = document.documentElement.clientHeight - 100;    // нижний край
setPosition();	// устанавливаем начальную позицию для blueRect

Далее определяем обработчик moveRect, в котором изменяем значения в массиве position:

function moveRect(e){
    switch(e.key){
         
    case "ArrowLeft":  // если нажата клавиша влево
        if(position[0] > 0)
            position[0] = position[0] - 10;
        break;
	//............
	}
    setPosition();
}

И после всех изменений переустанавливаем позицию с помощью функции setPosition.

В конце прикрепляем обработчик к нажатию клавиши клавиатуры:

window.addEventListener("keydown", moveRect);
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850