События клавиатуры, 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> |
-- "при удержании keypress зацикливается"
Так работает клавиатура смирись. Если не веришь открой блокнот зажми клавишу и она будет повторятся (за исключением некоторых специальных клавиш). -- "и не срабатывает keyup" Срабатывает но только когда отпускается клавиша. Снова тут поможет КЕП =). 1. Пока нажата клавиша клавиатура генерирует событие нажатия клавиши и отправляет его браузеру множество раз (т.е. эмулирует повторное нажатие). 2. keyup срабатывает только при отжатии клавиши. В твоем коде каждый раз при возникновении события keydown происходит создание нового события setInterval которое не зависит от setInterval созданных в предыдущих keydown. За одно нажатие могут создаваться тысячи setInterval а удаляется только последний setInterval остальные 999 продолжают пытаться выполнятся каждые 10 миллисекунд. Это примерно 100 вызовов функции в миллисекунду что довольно много и на слабых компьютерах может появляться эффект подвисания. |
так это программа клавиатуры
первые 999 вызовов setInterval удаляются но подсчет показывает не более двух сот вызовов до зацикливания и даже если удалить вызовы после всех событий клава тоже ведет себя странно - не сразу включает повтор ввода символа а через это условное переполнние |
Часовой пояс GMT +3, время: 22:34. |