Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
19 / 18 / 5
Регистрация: 30.05.2010
Сообщений: 227
1

Onkeydown и onkeyup задержка времени

15.08.2018, 17:50. Показов 1802. Ответов 8

Author24 — интернет-сервис помощи студентам
Всем привет.

В общем мне нужно отловить нажатие пробела при нажатом Ctrl.
Делаю так:

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
runOnKeys = function (key1,key2) {
   var codes = {
         0: key1,
         1: key2
   }; 
 
   var pressed = {};
   var upper = {};
 
   document.onkeydown = function(e) {
       var e = e || window.event;
      
       delete(upper[codes[1]]);
 
       if (e.keyCode === codes[0]) {
          pressed[codes[0]] = true;
       }
   };
 
   document.onkeyup = function(e) {
       var e = e || window.event;
 
       if (e.keyCode === codes[0] && pressed[codes[0]]) {
          delete(pressed[codes[0]]);
       }
 
       if (e.keyCode === codes[1] && pressed[codes[1]]) {
         upper[codes[1]] = true;
      }
 
      if (pressed[codes[0]] && upper[codes[1]]) {
          console.log('1');
      }
   };
};
Работает, но с задержкой. Если зажать ctrl подождать секунду и нажать пробел то выходит. А если сделать это быстро то нет. Как сделать правильно что бы работало мгновенно?

Добавлено через 10 минут
В строке 2 ошибка. Редактировать не могу т.к. пишет что уже 5 минут прошло.

Должно быть так
Javascript
1
if (e.keyCode === codes[1] && pressed[codes[0]]) {
Добавлено через 1 час 45 минут
точнее не в строке 2 а в строке 27
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.08.2018, 17:50
Ответы с готовыми решениями:

System hook onKeyUp onKeyDown
Добрый день. Может кто подскажет. Сделал системный хук на нажатие клавиш по данному примеру...

Задержка времени
Добрый день, столкнулся с такой проблемой, нужно реализовать точную задержку времени в 1 мс,...

Задержка времени
Добрый день! Я делаю игру РПГ, я создаю босса, и хотелось бы сделать так, чтоб он атаковал раз в 3...

Задержка пo времени
Есть ли в C# что-то типа Sleep? Т.е. если мне нужна просто задержка времени, в смысле подождать...

8
19 / 18 / 5
Регистрация: 30.05.2010
Сообщений: 227
16.08.2018, 10:22  [ТС] 2
Никто не знает? Никто этого никогда не делал?
0
Эксперт JS
2034 / 1093 / 408
Регистрация: 29.04.2016
Сообщений: 2,612
16.08.2018, 14:08 3
XOTAB,
Цитата Сообщение от XOTAB Посмотреть сообщение
мне нужно отловить нажатие пробела при нажатом Ctrl
Javascript
1
2
3
4
5
document.onkeydown = function(e) {
    if(e.ctrlKey && e.keyCode == 32){
        alert("Сочетание Ctrl+пробел");
    }
}
Песочница
0
19 / 18 / 5
Регистрация: 30.05.2010
Сообщений: 227
16.08.2018, 14:29  [ТС] 4
Во-первых первая клавиша может быть любая (та что указали в конфиге). То что я сказал Ctrl это пример. Может быть и Q и J и Shift и т.д.
Во-вторых там три комбинации:
1) Действие при нажатом Ctrl,
2) Действие при нажатии Space с зажатом Ctrl (причем выполнятеся столько раз сколько нажали Space не отпустив при этом Ctrl)
3) Действие при нажатии Shift при зажатых Ctrl и Space (выполняется столько раз сколько раз нажали на Shift при зажатых Ctrl и Space)
0
Эксперт JS
2034 / 1093 / 408
Регистрация: 29.04.2016
Сообщений: 2,612
16.08.2018, 14:52 5
Цитата Сообщение от XOTAB Посмотреть сообщение
В общем мне нужно отловить нажатие пробела при нажатом Ctrl.
Цитата Сообщение от XOTAB Посмотреть сообщение
А если сделать это быстро то нет. Как сделать правильно что бы работало мгновенно?
В приведенных от вас цитатах я вижу вопрос на который я ответил вам выше.
Цитата Сообщение от XOTAB Посмотреть сообщение
Во-первых первая клавиша может быть любая (та что указали в конфиге). То что я сказал Ctrl это пример. Может быть и Q и J и Shift и т.д.
Во-вторых там три комбинации:
Это, наверное, нужно было озвучивать в самом начале? Неа?
0
19 / 18 / 5
Регистрация: 30.05.2010
Сообщений: 227
16.08.2018, 15:05  [ТС] 6
Ну в коде же видно что клавиши указывается в параметрах функции. Значит клавиши могут быть любыми.
Цитата Сообщение от XOTAB Посмотреть сообщение
runOnKeys = function (key1,key2) {
0
Эксперт JS
2034 / 1093 / 408
Регистрация: 29.04.2016
Сообщений: 2,612
16.08.2018, 15:15 7
Цитата Сообщение от XOTAB Посмотреть сообщение
в коде же видно
Я тоже вижу очень очевидное и очень простое решение вашей проблемы, а вы его что не видите?- странно, но "в коде же видно"
Вы привели код не для таких ленивых как я. Таким ленивым, как я, нужно больше информативности в вопросе. Вот, лично я, даже не заглядывал в ваш код.
Составляя посты с вопросами, учитывайте то, что не все будут читать ваш код, старайтесь подробней объяснять "на пальцах"
Ждите может кто и ответит...
0
19 / 18 / 5
Регистрация: 30.05.2010
Сообщений: 227
16.08.2018, 15:24  [ТС] 8
Цитата Сообщение от zlojnaxa Посмотреть сообщение
Таким ленивым, как я, нужно больше информативности в вопросе. Вот, лично я, даже не заглядывал в ваш код.
Зачем вообще тогда отвечаете если вы даже в код не заглядывали? Таким как вы вообще тогда не нужно отвечать т.к. не посмотрев в код вы все равно ничем не поможете.

Добавлено через 5 минут
Решил сам. Только немного пришлось сменить логику.
Может кому пригодится или интересно, вот код:

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
runOnKeys = function (key1,key2,key3) {
            // Если не назначены клавиши, то назначаем Ctrl, Space, Q
            // При нажатии Ctrl + Space - листаем список вниз
            // При нажатии Ctrl + Q - листаем список вверх
            var codes = {
                0: key1 || 17, // По умолчанию Ctrl
                1: key2 || 32, // По умолчанию Space
                2: key3 || 81  // По умолчанию Q
            };
 
            var pressed = {};
 
            document.onkeydown = function(e) {
                var e = e || window.event;
 
                    if (e.keyCode === codes[0] && !pressed[codes[0]]) {
                        pressed[codes[0]] = true;
                    }
 
                    if (e.keyCode === codes[1] && (pressed[codes[0]] && !pressed[codes[1]])) {
                        pressed[codes[1]] = true;
                        console.log('Ctrl + Space');
                    }
 
                    if (e.keyCode === codes[2] && (pressed[codes[0]] && !pressed[codes[2]])) {
                        console.log('Ctrl + Q');
                    }
            };
 
            document.onkeyup = function(e) {
                var e = e || window.event;
 
                if (e.keyCode === codes[0]) {
                    delete(pressed[codes[0]]);
                }
 
                if (e.keyCode === codes[1]) {
                    delete(pressed[codes[1]]);
                }
            };
        };
 
        // Передаются коды клавиш. По умолчанию 17,32,81 (Ctrl,Пробел,Q)
        runOnKeys(17,32,81);
0
Эксперт JS
2034 / 1093 / 408
Регистрация: 29.04.2016
Сообщений: 2,612
16.08.2018, 15:54 9
Цитата Сообщение от XOTAB Посмотреть сообщение
Таким как вы вообще тогда не нужно отвечать
Таким как вы вообще не дано решать что таким как я делать а что нет.
0
16.08.2018, 15:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.08.2018, 15:54
Помогаю со студенческими работами здесь

Задержка времени в С++
Подскажите пожалуйста. В Microsoft Visual C++ 6.0 как и в остальных средах С++, задержка времени...

Задержка времени
Здравствуйте! Мне необходимо сделать задержку времени, чтобы перемещение элемента было...

задержка времени
Господа програмисты не подскажите как задержать программу на определённое время.если можно самый...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru