Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   очередность выполнения событий (https://javascript.ru/forum/events/72041-ocherednost-vypolneniya-sobytijj.html)

Conus 03.01.2018 11:17

очередность выполнения событий
 
по идее событие 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);

Aetae 03.01.2018 14:49

По какой такой идее?
Программа выполняется по порядку, ваш "obj(keyup)" выполняется моментально, он ничего не ждёт: он только навешивает обработчик и всё(просто говорит программе: "когда юзер отпустит конпку - вызвать функцию up")

Conus 03.01.2018 15:34

тогда что делать если надо выполнять код если нажата клавиша?

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);

Aetae 03.01.2018 16:16

Выполнять код по keydown. В любом случае пока он полностью не будет выполнен, никакого события keyup не произойдёт. Потому что js однопоточен. Если же у вас код выпоняется через промежутки времени(setTimeout/setInterval) то по keydown ставите флаг isKeyDown = true, по keyup - isKeyDown = false и в каждую итерацию таймера проверяете этот флаг.

Conus 03.01.2018 17:00

дело в том что если в кейдаун нажимаешь 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  += ' . '  //  событие

 
    });

Aetae 03.01.2018 18:13

<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>

Conus 04.01.2018 19:15

я лучше-б так сделал бы
но не врубаюсь как цикл организовать
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() ) } //  здесь висну

});

Aetae 04.01.2018 19:47

Забудьте о циклах для взаимодействия с пользователем в js. Пока цикл не отработает ни одно пользовательское событие не пройдёт. JS однопоточен.

Вот тема от вашего брата по разуму: https://javascript.ru/forum/css-html...-continue.html почитайте, может что поймёте. (Есть подозрение, что вы пришли сюда с одних курсов по переквалификации с низкоуровневых языков:).) А лучше почитайте учебник с этого сайта с нуля, т.к. ваше представление о том, как всё это работает на низком уровне тут только мешает.


P.S. Булевой перемеренной всё равно не получится, т.к. одновременно могут нажиматься и отпускаться много клавиш.


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