Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   перехват нажатие 3х кнопок (https://javascript.ru/forum/events/30934-perekhvat-nazhatie-3kh-knopok.html)

czp 21.08.2012 07:37

перехват нажатие 3х кнопок
 
подскажите как сделать перехват кнопок, что бы я перехватил все нажатые кнопки, тоесть, если человек нажмет 3 или 4 кнопки на клаве их все перехватит,как такое сделать?
у меня получается вот что,но так я только отслеживаю одну кнопку
function checkKeycode(e) {
    var key;
    
	if (window.event) { 
	  key = window.event.keyCode;
	} else if (e) {
	  key = e.which;
	}

	alert(key);
 }
  
  window.onkeydown = function (event) {checkKeycode(event)}

думал через цикл, как то завернуть, что бы закидывало в массив, а потом по циклу считывало, но провалилась эта затея, направте на истинный путь,есть какие то решения??
P.S. : решение нужно без джейквери

Aetae 21.08.2012 08:23

Ну для спец. клавиш есть e.altKey, e.ctrlKey, e.shiftKey, e.metaKey.
А так просто вручную делать триггер на нужную клавишу, т.е. при кейдаун - ставить переменно true при keyup - false.
<!DOCTYPE HTML>
<html lang="ru-RU">
<body><input>
<script>
var keys={};
function show() {
	var str='';
	for(var i in keys)if(keys[i]) str += (String.fromCharCode(i)||i)+' + ';
	document.body.firstChild.value = str.slice(0,-3);
}
function key(e) {
	var key;
	if (window.event) {
		key = window.event.keyCode;
	} else if (e) {
		key = e.which;
	}

	keys[key]= e.type === 'keydown' ? true : false;

	show()
}
window.onkeydown = window.onkeyup = key;
</script>
</body>
</html>

czp 22.08.2012 07:40

спасибо

czp 23.08.2012 22:00

ребят такая вот проблема, при рахной раскладке, и разных включенных прогах у меня каждый раз выдает разные коды на одну и туже кнопку, как можно сделать грамотно? что бы всегда выдавало мне нужную кнопку?

Deff 23.08.2012 22:08

czp,
Вот вчерашнее обсуждение
http://javascript.ru/forum/offtopic/...laviatury.html

czp 24.08.2012 11:11

спасиба, статья то что нужно)

daima 29.08.2012 16:50

А вот вопрос такой. Допустим мы нажали клавишу "стрелка вверх", потом нажали "стрелка вниз". Потом одну из них отпустили. как узнать какая осталась нажатой

Aetae 29.08.2012 17:02

В моём примере всё работает.

daima 29.08.2012 22:22

Цитата:

Сообщение от Aetae (Сообщение 201447)
В моём примере всё работает.

К сожалению, не корректно:
Нажали на стрелка вверх, не отпуская на стрелка вниз, получили & + (
Отпустили стрелку вверх - получили ( Логично. Не отпуская кнопку нажимаем стрелка вверх - почему-то имеем & + (, а не (+&

Aetae 30.08.2012 02:36

Цитата:

Сообщение от daima (Сообщение 201519)
К сожалению, не корректно:
Нажали на стрелка вверх, не отпуская на стрелка вниз, получили & + (
Отпустили стрелку вверх - получили ( Логично. Не отпуская кнопку нажимаем стрелка вверх - почему-то имеем & + (, а не (+&

Потому что:
1. Старые нажатия кнопок не удаляются, а обнуляются.(лень было что-ьто лишнеее придумывать, лоя примера и для большинства применений - сойдёт).
2. Для хранения используется объект, который в принципе не гарантирует порядок содержимого.

А вообще:
Цитата:

Сообщение от daima (Сообщение 201444)
А вот вопрос такой. Допустим мы нажали клавишу "стрелка вверх", потом нажали "стрелка вниз". Потом одну из них отпустили. как узнать какая осталась нажатой

... и где хоть слово о порядке вывода?

Если нужно точно соблюдать порядок - придумайте свой вариант хранения нажатых кнопок: массив, строка или ещё что-нить.

daima 30.08.2012 11:53

не могу в твоем коде разобраться


<!DOCTYPE HTML>
<html lang="ru-RU">
<body><input>
<script>
var keys={};
function show() {
	var str='';
	for(var i in keys)if(keys[i]) str += (String.fromCharCode(i)||i)+' + ';
	document.body.firstChild.value = str.slice(0,-3);
}
тут я долго пытался вывести код клавиш, но так и не смог((

function key(e) {
var key;
if (window.event) {
		key = window.event.keyCode;
	} else if (e) {
		key = e.which;
	}
вот эту запись не догнал

keys[key]= e.type === 'keydown' ? true : false;

здесь, я так понимаю, мы храним список клавиш, которые когда либо нажимались

show()
}
window.onkeydown = window.onkeyup = key;
</script>
</body>
</html>

Aetae 30.08.2012 18:16

Расписал детально.
<!DOCTYPE HTML>
<html lang="ru-RU">
<body><input>
<script>
(function(){ //анонимная функция чтобы не сорить в глобальную область видимости
	function addEvent(elem, type, func) { //кроссбраузерное навешивание события, в любой(почти) библтотеке есть своя
		return elem.addEventListener ? elem.addEventListener(type, func, false) : elem.attachEvent('on' + type, func); //первый случай для нормальных браузеров, второй для осла
	}

	var keys = [], //массив нажтых клавиш
		names = {
			16: 'Shift',
			17: 'Ctrl', 
			18:	'Alt',
			37: 'Left',
			38: 'Up', 
			39:	'Right',
			40:	'Down',
			32:	'Space'
			//...
		}; //имена спецклавиш, если нужно


	function key(e) {
		e || (e = event);
		var key = e.which || e.keyCode, //первый случай для нормальных браузеров, второй для осла
			i = keys.length;
		if(e.type === 'keydown'){ //если событие keydown, т.е. клавиша нажата
			if( keys[i-1] !== key ){ //если срабатываение не повторное
				keys.push(key); //добавляем нажатую в конец массива
			}
		} else { //если клавиа поднята
			while(i--){ //перебор массива, можно было бы обойтись indexOf, да осёл не позволяет
				if( keys[i] === key){ //если есть такая
					keys.splice(i,1); //то удаляем её из массива
				}
			}
		}
		show() //обновление выводимой информации, если вывод не планируется, то это вам не нужно
		
		e.preventDefault ? e.preventDefault() : ( e.returnValue = false ); //отмена срабатывания стандартного сочетания клавиш, как обычно первый случай для нормальных браузеров, второй для осла
	}
	function show() { //
		var i = keys.length, 
			arr = keys.slice(0); //копируем массив клавиш
		while(i--){ 
			/*	
				Перебираем копию массива,
				сначаля ищем совпадения среди спецклавиш в names,
				затем пытаемся получить букву по коду клавиши,
				и в итоге, если ничего не вышло, оставляем код.
			*/
			arr[i] = names[ arr[i] ] || String.fromCharCode( arr[i] ) || '['+arr[i]+']';
		}
		document.body.firstChild.value = arr.join('+'); //вывод в первый элемент документа, в данном случае input
	}
	addEvent(document, 'keydown', key);
	addEvent(document, 'keyup', key);
}())
</script>
</body>
</html>


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