03.01.2018, 11:17
|
|
Аспирант
|
|
Регистрация: 05.12.2015
Сообщений: 85
|
|
очередность выполнения событий
по идее событие 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);
Последний раз редактировалось Conus, 03.01.2018 в 11:22.
|
|
03.01.2018, 14:49
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,586
|
|
По какой такой идее?
Программа выполняется по порядку, ваш "obj(keyup)" выполняется моментально, он ничего не ждёт: он только навешивает обработчик и всё(просто говорит программе: "когда юзер отпустит конпку - вызвать функцию up")
__________________
29375, 35
|
|
03.01.2018, 15:34
|
|
Аспирант
|
|
Регистрация: 05.12.2015
Сообщений: 85
|
|
тогда что делать если надо выполнять код если нажата клавиша?
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);
Последний раз редактировалось Conus, 03.01.2018 в 15:41.
|
|
03.01.2018, 16:16
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,586
|
|
Выполнять код по keydown. В любом случае пока он полностью не будет выполнен, никакого события keyup не произойдёт. Потому что js однопоточен. Если же у вас код выпоняется через промежутки времени(setTimeout/setInterval) то по keydown ставите флаг isKeyDown = true, по keyup - isKeyDown = false и в каждую итерацию таймера проверяете этот флаг.
__________________
29375, 35
|
|
03.01.2018, 17:00
|
|
Аспирант
|
|
Регистрация: 05.12.2015
Сообщений: 85
|
|
дело в том что если в кейдаун нажимаешь 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 += ' . ' // событие
});
Последний раз редактировалось Conus, 03.01.2018 в 17:11.
|
|
03.01.2018, 18:13
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,586
|
|
<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>
__________________
29375, 35
|
|
04.01.2018, 19:15
|
|
Аспирант
|
|
Регистрация: 05.12.2015
Сообщений: 85
|
|
я лучше-б так сделал бы
но не врубаюсь как цикл организовать
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() ) } // здесь висну
});
|
|
04.01.2018, 19:47
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,586
|
|
Забудьте о циклах для взаимодействия с пользователем в js. Пока цикл не отработает ни одно пользовательское событие не пройдёт. JS однопоточен.
Вот тема от вашего брата по разуму: https://javascript.ru/forum/css-html...-continue.html почитайте, может что поймёте. (Есть подозрение, что вы пришли сюда с одних курсов по переквалификации с низкоуровневых языков .) А лучше почитайте учебник с этого сайта с нуля, т.к. ваше представление о том, как всё это работает на низком уровне тут только мешает.
P.S. Булевой перемеренной всё равно не получится, т.к. одновременно могут нажиматься и отпускаться много клавиш.
__________________
29375, 35
Последний раз редактировалось Aetae, 04.01.2018 в 19:50.
|
|
|
|