Аватар для XOTAB
19 / 18 / 5
Регистрация: 30.05.2010
Сообщений: 227

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

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

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

В общем мне нужно отловить нажатие пробела при нажатом 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.08.2018, 17:50
Ответы с готовыми решениями:

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

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

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

8
 Аватар для XOTAB
19 / 18 / 5
Регистрация: 30.05.2010
Сообщений: 227
16.08.2018, 10:22  [ТС]
Никто не знает? Никто этого никогда не делал?
0
Эксперт JS
2037 / 1096 / 409
Регистрация: 29.04.2016
Сообщений: 2,625
16.08.2018, 14:08
XOTAB,
Цитата Сообщение от XOTAB Посмотреть сообщение
мне нужно отловить нажатие пробела при нажатом Ctrl
JavaScript
1
2
3
4
5
document.onkeydown = function(e) {
    if(e.ctrlKey && e.keyCode == 32){
        alert("Сочетание Ctrl+пробел");
    }
}
Песочница
0
 Аватар для XOTAB
19 / 18 / 5
Регистрация: 30.05.2010
Сообщений: 227
16.08.2018, 14:29  [ТС]
Во-первых первая клавиша может быть любая (та что указали в конфиге). То что я сказал Ctrl это пример. Может быть и Q и J и Shift и т.д.
Во-вторых там три комбинации:
1) Действие при нажатом Ctrl,
2) Действие при нажатии Space с зажатом Ctrl (причем выполнятеся столько раз сколько нажали Space не отпустив при этом Ctrl)
3) Действие при нажатии Shift при зажатых Ctrl и Space (выполняется столько раз сколько раз нажали на Shift при зажатых Ctrl и Space)
0
Эксперт JS
2037 / 1096 / 409
Регистрация: 29.04.2016
Сообщений: 2,625
16.08.2018, 14:52
Цитата Сообщение от XOTAB Посмотреть сообщение
В общем мне нужно отловить нажатие пробела при нажатом Ctrl.
Цитата Сообщение от XOTAB Посмотреть сообщение
А если сделать это быстро то нет. Как сделать правильно что бы работало мгновенно?
В приведенных от вас цитатах я вижу вопрос на который я ответил вам выше.
Цитата Сообщение от XOTAB Посмотреть сообщение
Во-первых первая клавиша может быть любая (та что указали в конфиге). То что я сказал Ctrl это пример. Может быть и Q и J и Shift и т.д.
Во-вторых там три комбинации:
Это, наверное, нужно было озвучивать в самом начале? Неа?
0
 Аватар для XOTAB
19 / 18 / 5
Регистрация: 30.05.2010
Сообщений: 227
16.08.2018, 15:05  [ТС]
Ну в коде же видно что клавиши указывается в параметрах функции. Значит клавиши могут быть любыми.
Цитата Сообщение от XOTAB Посмотреть сообщение
runOnKeys = function (key1,key2) {
0
Эксперт JS
2037 / 1096 / 409
Регистрация: 29.04.2016
Сообщений: 2,625
16.08.2018, 15:15
Цитата Сообщение от XOTAB Посмотреть сообщение
в коде же видно
Я тоже вижу очень очевидное и очень простое решение вашей проблемы, а вы его что не видите?- странно, но "в коде же видно"
Вы привели код не для таких ленивых как я. Таким ленивым, как я, нужно больше информативности в вопросе. Вот, лично я, даже не заглядывал в ваш код.
Составляя посты с вопросами, учитывайте то, что не все будут читать ваш код, старайтесь подробней объяснять "на пальцах"
Ждите может кто и ответит...
0
 Аватар для XOTAB
19 / 18 / 5
Регистрация: 30.05.2010
Сообщений: 227
16.08.2018, 15:24  [ТС]
Цитата Сообщение от 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
2037 / 1096 / 409
Регистрация: 29.04.2016
Сообщений: 2,625
16.08.2018, 15:54
Цитата Сообщение от XOTAB Посмотреть сообщение
Таким как вы вообще тогда не нужно отвечать
Таким как вы вообще не дано решать что таким как я делать а что нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.08.2018, 15:54
Помогаю со студенческими работами здесь

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

Задержка времени в С++
Подскажите пожалуйста. В Microsoft Visual C++ 6.0 как и в остальных средах С++, задержка времени осуществляется функцией Sleep(); Но...

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru