Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Обработка событий клавиатуры (https://javascript.ru/forum/events/3433-obrabotka-sobytijj-klaviatury.html)

MaxPayne 18.04.2009 12:21

Обработка событий клавиатуры
 
Есть на странице три дива.

1. Первый див.

2. Второй див и перемещающийся по нему третий див.

Нужно сделать так, чтобы по щелчку на первый див можно было с помощью клавиатуры управлять им.
По щелчку на второй див - можно было бы управлять третьим.
По щелчку на свободной от дивов области управлять окном браузера (по стандарту).

Kolyaj 18.04.2009 12:22

А проблема в чем?

MaxPayne 18.04.2009 12:33

Прописываю в onkeypress второго дива функцию, по которой происходит сдвиг третьего дива внутри второго, но управление по прежнему остается окна браузера, а не необходимого дива.

Kolyaj 18.04.2009 12:42

Откуда у дива возьмется событие keypress?

MaxPayne 18.04.2009 12:51

Ясно. С мышью тут конечно проще, а как поступить в таком случае с клавиатурой?

Riim 18.04.2009 12:58

Кусок из Jquery:
// Add which for key events
if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
	event.which = event.charCode || event.keyCode;


str 2745

Дальше по таблице кодов.
Наиболее полную версию видел в MochiKit.

MaxPayne 18.04.2009 15:16

Цитата:

Сообщение от Riim (Сообщение 16990)
Кусок из Jquery

Спасибо! А что-нибуь из прототайпа есть по этой теме?

Riim 18.04.2009 16:08

В PrototypeJs есть добавление/удаление обработчика, но обработки объекта события нет. Можно поискать плагин или дописать, выдрав нужное из Jquery и MochiKit.
upd:
>>> обработки объекта события нет
Хотя, нет, что-то вреде есть, но послабее чем в Jquery

MaxPayne 18.04.2009 22:13

Написал. Вроде все получилось =) Спасибо.
Правда проблема одна появилась...
Объявляю - document.onkeypress = keymove; (где keymove - функция обработки событий клавиатуры). Обработка событий клавиатуры работает, но вместе с ней работает и скроллбар вертикальный у документа. Как грамотнее сделать? Как отключить движение скроллбара с помощью клавиатуры?

Riim 18.04.2009 22:25

Может в самый первый момент нажатия запомнить положение scroll-а и при отпускании клавиши установить его через window.scrollTo .
Только все равно дергаться будет.
Не понимаю, почему не работает window.onscroll = function() {retutn false};
Вроде вполне логичный вариант.

MaxPayne 18.04.2009 22:40

Да, window.onscroll было бы логично, как с правой кнопкой мыши. Но увы..

У меня див начинает перемещаться вниз только в тот момент, когда весь скролл вниз опустится. То есть если можно скроллировать вниз - то скроллируется, если нельзя - то двигается див. Поэтому вариант через scrollTo тоже не подойдет.

Kolyaj 18.04.2009 22:42

Лучше перехватывать и отменять keydown.

MaxPayne 18.04.2009 22:49

Сейчас попробовал вот так:
window.onscroll = null;

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

Riim 18.04.2009 22:49

Цитата:

Сообщение от Kolyaj
Лучше перехватывать и отменять keydown.

О, точно, прямо из обработчика нажатия false вернуть надо.

Riim 18.04.2009 22:53

И вот еще:

e.stop = function() {
				if (originalEvent.preventDefault) {
					originalEvent.preventDefault();
					originalEvent.stopPropagation();
				} else {
					originalEvent.returnValue = false;
					originalEvent.cancelBubble = true;
				}
				return e;
			};


Только переделать надо.

MaxPayne 18.04.2009 23:07

Цитата:

Сообщение от Riim (Сообщение 17064)
Только переделать надо.

Что именно? просто я еще далек от всего того, что вы обсуждаете с Николаем. Делаю только первые шаги.

Riim 18.04.2009 23:13

В функции, которая прикреплена к document.onkeypress в самом конце return false;
А в самом начале:
function (e) {
    if (e.preventDefault) {
        e.preventDefault();
        e.stopPropagation();
    } else {
        e.returnValue = false;
        e.cancelBubble = true;
    }

MaxPayne 18.04.2009 23:15

Сейчас попробую.

Тыкнул в боди onscroll="scrollTo(0,0);". Не алло, т.е. не красиво.

MaxPayne 18.04.2009 23:20

Ну что сказать?! Молодцы, парни! Каждому по +1.
Все работает аккуратно и красиво.

Riim 18.04.2009 23:23

Цитата:

Сообщение от MaxPayne
Все работает аккуратно и красиво.

Выкладывай архивом. Поглазеть хочется.
зы: ничего, что на ты?

MaxPayne 18.04.2009 23:30

Можно на "ты" =)

К сожалению, руководство не разрешает выкладывать инфу по разрабатываемому проекту. Типа коммерческая тайна и прочее. Но как только появится в Интернете первый сайт с этой разработкой - вас первых обеспечу необходимой ссылкой. Даю слово!

Riim 18.04.2009 23:36

Цитата:

Сообщение от MaxPayne
К сожалению, руководство не разрешает выкладывать инфу по разрабатываемому проекту. Типа коммерческая тайна и прочее. Но как только появится в Интернете первый сайт с этой разработкой - вас первых обеспечу необходимой ссылкой. Даю слово!

Ну нет, так нет. Просто делать нечего. Прилепил бы к диву машинку.. разметил бы трассу....:)

MaxPayne 19.04.2009 03:42

А на русском есть мануалы по этим функциям? Чтобы полностью изучить области и задачи, для которых их уместно применять.

MaxPayne 30.04.2009 13:59

Цитата:

Сообщение от Riim (Сообщение 17068)
В функции, которая прикреплена к document.onkeypress в самом конце return false;
А в самом начале:
function (e) {
    if (e.preventDefault) {
        e.preventDefault();
        e.stopPropagation();
    } else {
        e.returnValue = false;
        e.cancelBubble = true;
    }

А как после того как такие обработчики заработают - вернуть все к стандартному виду. Т.е. допустим щелкнул по активной области - работают обработчики, щелкнул по свободной части рабочей области браузера - клавиши выполняют свои стандартные функции. Произвести полную очистку обработчиков? Не будет ли утечки памяти, если многократно включать их и удалять?

Riim 01.05.2009 01:01

Цитата:

Сообщение от MaxPayne
А на русском есть мануалы по этим функциям? Чтобы полностью изучить области и задачи, для которых их уместно применять.

http://javascript.ru/tutorial/events/intro

Цитата:

Сообщение от MaxPayne
А как после того как такие обработчики заработают - вернуть все к стандартному виду. Т.е. допустим щелкнул по активной области - работают обработчики, щелкнул по свободной части рабочей области браузера - клавиши выполняют свои стандартные функции. Произвести полную очистку обработчиков?

http://javascript.ru/tutorial/events/crossbrowser
Только там, в предлагаемом коде, ошибка есть. Я писал о ней здесь: http://javascript.ru/forum/events/34...-sobytiyu.html, но никто не отреагировал.

Цитата:

Сообщение от MaxPayne
Не будет ли утечки памяти, если многократно включать их и удалять?

Если действительно удалять, то не будет. Только ошибка как раз в том, что они не обязательно будут удаляться.

MaxPayne 01.05.2009 09:58

Цитата:

Сообщение от Riim (Сообщение 17971)
http://javascript.ru/tutorial/events/crossbrowser
Только там, в предлагаемом коде, ошибка есть. Я писал о ней здесь: http://javascript.ru/forum/events/34...-sobytiyu.html, но никто не отреагировал.

Спасибо. Почитаю, разберусь.
Еще времени не так много прошло, может админ работает над устранением этой ошибки.

А в том примере, удаление обработчиков нормально работает? Без утечек? Можно применять?

Riim 01.05.2009 10:37

Цитата:

Сообщение от MaxPayne
А в том примере, удаление обработчиков нормально работает?

В том и есть ошибка, что не нормально.


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