Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   События клавиатуры, keypress зацикливается | при удержании ? (https://javascript.ru/forum/events/72872-sobytiya-klaviatury-keypress-zaciklivaetsya-%7C-pri-uderzhanii.html)

Conus 03.03.2018 20:37

События клавиатуры, keypress зацикливается | при удержании ?
 
при удержании keypress зацикливается и не срабатывает keyup
при всем этом все остальные функции работают как ни в-чем не бывало

если удерживать не долго то зацикливания не происходит
наверно это как-то связано с переполнением
подскажите пожалуйста
<!DOCTYPE HTML>
<html>
 <head>

<script type="text/JavaScript">	
var obj = {}, step;
obj.even = '';
 obj.Is = false;
var	IsKey = function() { return obj.Is; }, even = function() { return obj.even; };	
function Step(e) 
{
	
	if (typeof obj.count  === 'undefined') { obj.count  = 0; } else  { obj.count++; }
	 document.body.innerHTML = IsKey() + ' ' + obj.even + obj.count
}

(  
  ( 
	 function(elem, type, Handl)
	 {
	    if (elem.attachEvent){ elem.attachEvent("on"+type, Handl) } else { elem.addEventListener(type, Handl, false) }
		return arguments.callee;
	 }
 
 )(window, 'keydown', function(e) { obj.Is = true; obj.even = e;  step = setInterval(Step, 10) }  )
)(window, 'keyup', function(e)  { obj.Is = false; obj.even = '';  clearInterval(step);  step = '';  Step(); } )

</script>		



 </head>
 <body>
 
 </body>
</html>

MallSerg 04.03.2018 01:06

-- "при удержании keypress зацикливается"
Так работает клавиатура смирись.
Если не веришь открой блокнот зажми клавишу и она будет повторятся (за исключением некоторых специальных клавиш).

-- "и не срабатывает keyup"
Срабатывает но только когда отпускается клавиша.

Снова тут поможет КЕП =).
1. Пока нажата клавиша клавиатура генерирует событие нажатия клавиши и отправляет его браузеру множество раз (т.е. эмулирует повторное нажатие).
2. keyup срабатывает только при отжатии клавиши.

В твоем коде каждый раз при возникновении события keydown происходит создание нового события setInterval которое не зависит от setInterval созданных в предыдущих keydown.

За одно нажатие могут создаваться тысячи setInterval а удаляется только последний setInterval остальные 999 продолжают пытаться выполнятся каждые 10 миллисекунд.
Это примерно 100 вызовов функции в миллисекунду что довольно много и на слабых компьютерах может появляться эффект подвисания.

Conus 04.03.2018 08:50

так это программа клавиатуры
первые 999 вызовов setInterval удаляются

но подсчет показывает не более двух сот вызовов до зацикливания
и даже если удалить вызовы после всех событий клава тоже ведет себя странно

- не сразу включает повтор ввода символа а через это условное переполнние


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