очередность выполнения событий
по идее событие document.body.innerHTML += '.' в value.down должно происходить после ответа в value.up
на деле выводится сразу в первой функции очерёдность события происходит параллельно с вызываемой то-есть возникновение цикла ожидания value.down не происходит загвоздка в том что вчера выполнялось document.body.innerHTML += window.event.type пока не происходило событие value.up чего придётся ждать завтра может это только у меня так под вопросом сам javascript var obj, value = {}; if (window.attachEvent) { obj = function (element, event, handler) { element.attachEvent('on' + event, handler); } } else { obj = function (element, event, handler) { element.addEventListener(event, handler, false); }; } value.up = function(e) { document.body.innerHTML += window.event.type if ( window.event.type == 'keyup') { document.body.innerHTML += '# сука' } } value.down = function() { obj(window, 'keyup', value.up) document.body.innerHTML += '.' //очерёдность события происходит параллельно obj(window, 'keyup', value.up) } obj(window, 'keydown', value.down); |
По какой такой идее?
Программа выполняется по порядку, ваш "obj(keyup)" выполняется моментально, он ничего не ждёт: он только навешивает обработчик и всё(просто говорит программе: "когда юзер отпустит конпку - вызвать функцию up") |
тогда что делать если надо выполнять код если нажата клавиша?
var Boo = false, obj, value = {}; if (window.attachEvent) { obj = function (element, event, handler) { element.attachEvent('on' + event, handler); } } else { obj = function (element, event, handler) { element.addEventListener(event, handler, false); }; } value.up = function(e) { if(window.event.type == 'keyup') { Boo = true; document.body.innerHTML += Boo; } } value.down = function(e) { while(Boo) { alert(Boo); }//document.body.innerHTML += ' . '; } obj(window, 'keyup', value.up) } obj(window, 'keydown', value.down); |
Выполнять код по keydown. В любом случае пока он полностью не будет выполнен, никакого события keyup не произойдёт. Потому что js однопоточен. Если же у вас код выпоняется через промежутки времени(setTimeout/setInterval) то по keydown ставите флаг isKeyDown = true, по keyup - isKeyDown = false и в каждую итерацию таймера проверяете этот флаг.
|
дело в том что если в кейдаун нажимаешь ctrl событие определенное в нем же выполняется один раз а если нажать символ допустим событие будет повторятся
как тут определишь цикл или последовательность var Boo = false, obj, value = {}; if (window.attachEvent) { obj = function (element, event, handler) { element.attachEvent('on' + event, handler); } } else { obj = function (element, event, handler) { element.addEventListener(event, handler, false); }; } value.up = function(e) { document.body.innerHTML += window.event.type } obj(window, 'keydown', function(e) { obj(window, 'keyup', value.up) document.body.innerHTML += ' . ' // событие }); |
<body> <input id="startbuton" type="button" value="Поекхали"> <script> var keysdown = {}; function keyEvent(e){ keysdown[e.keyCode] = (e.type === 'keyup' || e.keyCode < 0x20) ? false : String.fromCharCode(e.keyCode); //только англиская раскладка, т.к. мы работаем с конкретными клавишами, а не с текстом, для того другие способы keysdown.ctrlKey = e.ctrlKey && 'Ctrl'; keysdown.altKey = e.altKey && 'Alt'; keysdown.shiftKey = e.shiftKey && 'Shift'; e.preventDefault(); } addEventListener('keyup', keyEvent); addEventListener('keydown', keyEvent); startbuton.addEventListener('click', function next(){ var output = ''; for(var key in keysdown) if(keysdown.hasOwnProperty(key)){ if(keysdown[key]) output += 'Нажата клавиша "' + keysdown[key] + '". '; } if(!output){ output = 'Ничего не нажато.'; } document.body.innerHTML = output; setTimeout(next, 100); }); </script> <body> |
я лучше-б так сделал бы
но не врубаюсь как цикл организовать var Is = false, obj, value = {}, IsKey = function() { return Is; }; ( ( function(elem, type, Handl) { if (elem.attachEvent){ elem.attachEvent("on"+type, Handl) } else { elem.addEventListener(type, Handl, false) } return arguments.callee; } )(window, 'keydown', function() { Is = true } ) )(window, 'keyup', function() { Is = false } ) if (window.attachEvent) { obj = function (element, event, handler) { ielement.attachEvent('on' + event, handler) } } else { obj = function (element, event, handler) { element.addEventListener(event, handler, false) }; } value.up = function() //window.event.type { document.body.innerHTML += ' .... ' + IsKey() } obj(window, 'keydown', function() { obj(window, 'keyup', value.up); document.body.innerHTML += ' . ' + IsKey() + '<br>'; // while (IsKey() ) { alert(IsKey() ) } // здесь висну }); |
Забудьте о циклах для взаимодействия с пользователем в js. Пока цикл не отработает ни одно пользовательское событие не пройдёт. JS однопоточен.
Вот тема от вашего брата по разуму: https://javascript.ru/forum/css-html...-continue.html почитайте, может что поймёте. (Есть подозрение, что вы пришли сюда с одних курсов по переквалификации с низкоуровневых языков:).) А лучше почитайте учебник с этого сайта с нуля, т.к. ваше представление о том, как всё это работает на низком уровне тут только мешает. P.S. Булевой перемеренной всё равно не получится, т.к. одновременно могут нажиматься и отпускаться много клавиш. |
Часовой пояс GMT +3, время: 06:10. |