Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как определить нажата какая-либо клавиша или нет? (https://javascript.ru/forum/misc/7315-kak-opredelit-nazhata-kakaya-libo-klavisha-ili-net.html)

Бобр 26.01.2010 13:21

Как определить нажата какая-либо клавиша или нет?
 
Как определить нажата какая-либо клавиша или нет?

То есть не при нажатии, а просто в куске кода на жаваскрипте. Что-нибудь типа IsKeyDown(); ?

Gvozd 26.01.2010 14:12

стандартными средствами нет
но очевидно же как это написать:
<script type="text/javascript">
(function(){
var keyDown=false;
window.isKeyDown=function(){
return keyDown;
};
((function(elem, type, handler){
  if (elem.addEventListener){
    elem.addEventListener(type, handler, false)
  } else {
    elem.attachEvent("on"+type, handler)
  }
return arguments.callee;
})(window.document,'keydown',function(){keyDown=true}))
(window.document,'keyup',function(){keyDown=false})


})()
</script>
<script type="text/javascript">
setInterval(function(){document.getElementById('qwe').innerHTML=isKeyDown()},100);

</script>
<div id="qwe"></div><br/><br/><br/>

Бобр 26.01.2010 14:39

Ох, как-то очень сложно. Может быть можно тогда при клике по ссылке как-то проверять нажат ли Shift или Ctrl? В смысле, чтобы код бы попроще. А то я не понимаю просто.

Gvozd 26.01.2010 14:52

<script type="text/javascript">
(function(){
var keyDown=false;
window.isKeyDown=function(){
return keyDown;
};
var addEvent=function(elem, type, handler){
  if (elem.addEventListener){
    elem.addEventListener(type, handler, false)
  } else {
    elem.attachEvent("on"+type, handler)
  }
return arguments.callee;
}
addEvent(window.document,'keydown',function(event){
	event = (event) ? event : window.event;
	keyCode=(event.charCode) ? event.charCode : event.keyCode;
	if(keyCode==16)
		keyDown='Shift (keyCode='+keyCode+')';
	else if(keyCode==17)
		keyDown='Ctrl (keyCode='+keyCode+')';
	else
		keyDown='Another key (keyCode='+keyCode+')';
	});
addEvent(window.document,'keyup',function(){keyDown=false});
})()
</script>
<a href="#" onclick="this.innerHTML=isKeyDown()?('кнопка нажата: '+isKeyDown()):'кнопка не нажата';return false;">кнопка не нажата</a>

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

subzey 26.01.2010 22:06

Бобр,
<script type="text/javascript">
function foo(e){
alert("Ctrl " + (e.ctrlKey?"нажат":"не нажат") + "\r\n" + "Shift " + (e.shiftKey?"нажат":"не нажат") + "\r\n" + "Alt " + (e.altKey?"нажат":"не нажат") + "\r\n" + "Meta " + (e.metaKey?"нажата":"не нажата"));
}
</script>
<button onclick="foo(event)">Щелкни меня!</button>

PeaceCoder 26.01.2010 22:25

<script type="text/javascript">
function foo(e){
alert("Ctrl " + (e.ctrlKey?"нажат":"не нажат") + "\\r\\n" + "Shift " + (e.shiftKey?"нажат":"не нажат") + "\\r\\n" + "Alt " + (e.altKey?"нажат":"не нажат") + "\\r\\n" + "Meta " + (e.metaKey?"нажата":"не нажата"));
}
</script>
<button onclick="foo(event)">Щелкни меня!</button>
subzey,
забыл заэкранировать \

Gvozd 26.01.2010 22:36

subzey,
а теперь без рук))
всмысле не в событии))

B@rmaley.e><e 26.01.2010 23:02

Цитата:

Сообщение от PeaceCoder
забыл заэкранировать \

Зачем экранировать спец. символы? По-моему, они спец.символами выглядят лучше.

subzey 26.01.2010 23:13

PeaceCoder,
Это ж просто CRLF, зачем?

Gvozd,
ну, разве что, чтобы клавиши Win отслеживать. Или Esc мертвой клавишей делать а-ля-Никсы :)

Gvozd 26.01.2010 23:30

Цитата:

Сообщение от subzey
ну, разве что, чтобы клавиши Win отслеживать. Или Esc мертвой клавишей делать а-ля-Никсы

не понял как твой ответ соотносится с моим вопросом
я подразумевал, чтобы foo() не принимала объект события.
ведь не всегда есть такая возможность
поэтому я в этом контексте, и говорю "а без рук"

subzey 26.01.2010 23:40

Gvozd,
Я просто с таким же способом возился — ненадежно это.
Вдруг, какой-то несознательно поставленный обработчик сделает по keydown stopPropagation() или клавиша будет нажата пока окно не активно?
Так что, имхо, без особой необходимости (или, как раз-таки, экзотических случаев типа отслеживания WinKey) делать так не стóит…

Gvozd 26.01.2010 23:50

Цитата:

Сообщение от subzey
Я просто с таким же способом возился — ненадежно это.

спасибо. будем знать

PeaceCoder 27.01.2010 02:01

Цитата:

Сообщение от subzey
Это ж просто CRLF, зачем?

потому что они не экранируются при генерировании документа и твой пример не запускается. кстати это баг хайлайтера.

subzey 27.01.2010 02:18

Да, вроде, запускается и так. (Opera 10.10)

Но в любом случае, этот код был, прежде всего, для человека, потом — для браузера, и, уж в последнюю очередь, — для хайлайтера. :)

PeaceCoder 27.01.2010 02:24

Цитата:

Сообщение от subzey
Да, вроде, запускается и так. (Opera 10.10)

да в опере идет. а в мозиле нет. пишет типа незавершенная строка \n. через eval видимо идет

subzey 27.01.2010 02:36

PeaceCoder,
И впрямь!
Кстати, самое забавное, что под IE6-то запускается нормально.

Бобр 30.01.2010 11:29

Почему-то не могу добавить отзыв Gvozd . Пишут, что я должен добавить отзыв кому-то ещё. Кому? Я добавил subzey и PeaceCoder - не помогло.

Gvozd 30.01.2010 12:08

Бобр,
фиг с ней, с кармой. я не кармодрочер. простой благодарности вполне достаточно

Бобр 30.01.2010 13:04

Gvozd
Тогда просто благодарю! :) :victory:

Бобр 15.03.2010 05:34

Цитата:

Сообщение от subzey (Сообщение 42207)
Бобр,
<script type="text/javascript">
function foo(e){
alert("Ctrl " + (e.ctrlKey?"нажат":"не нажат") + "\r\n" + "Shift " + (e.shiftKey?"нажат":"не нажат") + "\r\n" + "Alt " + (e.altKey?"нажат":"не нажат") + "\r\n" + "Meta " + (e.metaKey?"нажата":"не нажата"));
}
</script>
<button onclick="foo(event)">Щелкни меня!</button>

Такой кривой вопрос, как вызвать foo, через addEventListener?

Так, не работает:
document.getElementById('myA').addEventListener("click", 
  function() {foo(event)}, false);

Чего хочет - не говорит.

Shaci 15.03.2010 06:04

document.getElementById('myA').addEventListener("click",
  foo, false);
}

Shaci 15.03.2010 06:22

document.getElementById('myA').addEventListener("click",
  function(e) {foo(e);}, false);
};

вроде не ошибаюсь

Бобр 15.03.2010 18:39

Цитата:

Сообщение от Shaci (Сообщение 47693)
document.getElementById('myA').addEventListener("click",
  function(e) {foo(e);}, false);
};

вроде не ошибаюсь

Нашёл сам. Надо вот так:

document.getElementById('myA').addEventListener("click",
     function(event) {foo(event)}, false);


:dance:

sysya 29.03.2010 09:03

А мне интересно как проверять Caps Look? Гуглил, не нашёл...

Aetae 29.03.2010 20:20

Как любую другую клавишу - в первом посте.

sysya 29.03.2010 21:31

Я имел ввиду как определить верхний регистр или нижний включён... Вот как это определять?

Aetae 29.03.2010 21:53

Ставлю 5 рублей, что никак иначе нежели эмпирически.)

subzey 29.03.2010 22:43

Aetae,
Беспроигрышное пари.

sysya 29.03.2010 23:50

нашёл статью где описан способ определения, нажат ли Caps Lock http://hostdarom.com/2010/03/02/skaz...-li-caps-lock/

subzey 30.03.2010 13:51

sysya,
так это ж и есть, эмпирически: дождаться нажатия, а потом посмотреть, верхняя касса, или нижняя.

Страшно представить, как определить, включен ли Ins. :)

sysya 30.03.2010 16:45

Не знал что значит эмпирически :) А чё делает клавка Ins. Видел есть функция для определения нажат ли Num Lock, в эту сторону думаю копать. При нажатии Num Lock, на сколько знаю коды клавишь меняются в поле Num'а и чё та не все браузёры это понимают одинаково...

subzey 30.03.2010 23:52

sysya,
кстати, Бирмановская раскладка заставила этот скрипт по определению капслока понервничать. :)

clecar 11.11.2016 09:35

window.captureEvents(Event.onkeydown); 
window.onkeydown= pressed; 
function pressed(e) {  alert(e.which)}

clecar 11.11.2016 10:01

У меня вопрос, близкий к теме, почему во время загрузки страницы. Значение (e.which) принимает сначала 18, тут же меняет на 68 и один раз повторит после (ok) на 68. Дальше работает нормально. У меня браузер мудрит?

clecar 11.11.2016 18:42

Моя (АЗБУКА НА КЛАВИАТУРЕ), часто при первом открывании начинает с ВОРОНЫ. И ещё при работе на сайте, перестали останавливаться гифки. Записаны на один просмотр. http://clecar.ru/azbyka.html
Без алерта тоже 68, только первоначальная загрузка, после обновления нормально.
<head>
<script>
window.captureEvents(Event.onkeydown); 
window.onkeydown= pressed; 
function pressed(e) { 
document.all.ah.innerHTML=e.which;
}
</script>
</head>
<body>
<div id="ah">0</div>
</body>


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