Обработка событий клавиатуры
Есть на странице три дива.
1. Первый див. 2. Второй див и перемещающийся по нему третий див. Нужно сделать так, чтобы по щелчку на первый див можно было с помощью клавиатуры управлять им. По щелчку на второй див - можно было бы управлять третьим. По щелчку на свободной от дивов области управлять окном браузера (по стандарту). |
А проблема в чем?
|
Прописываю в onkeypress второго дива функцию, по которой происходит сдвиг третьего дива внутри второго, но управление по прежнему остается окна браузера, а не необходимого дива.
|
Откуда у дива возьмется событие keypress?
|
Ясно. С мышью тут конечно проще, а как поступить в таком случае с клавиатурой?
|
Кусок из 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. |
Цитата:
|
В PrototypeJs есть добавление/удаление обработчика, но обработки объекта события нет. Можно поискать плагин или дописать, выдрав нужное из Jquery и MochiKit.
upd: >>> обработки объекта события нет Хотя, нет, что-то вреде есть, но послабее чем в Jquery |
Написал. Вроде все получилось =) Спасибо.
Правда проблема одна появилась... Объявляю - document.onkeypress = keymove; (где keymove - функция обработки событий клавиатуры). Обработка событий клавиатуры работает, но вместе с ней работает и скроллбар вертикальный у документа. Как грамотнее сделать? Как отключить движение скроллбара с помощью клавиатуры? |
Может в самый первый момент нажатия запомнить положение scroll-а и при отпускании клавиши установить его через window.scrollTo .
Только все равно дергаться будет. Не понимаю, почему не работает window.onscroll = function() {retutn false}; Вроде вполне логичный вариант. |
Да, window.onscroll было бы логично, как с правой кнопкой мыши. Но увы..
У меня див начинает перемещаться вниз только в тот момент, когда весь скролл вниз опустится. То есть если можно скроллировать вниз - то скроллируется, если нельзя - то двигается див. Поэтому вариант через scrollTo тоже не подойдет. |
Лучше перехватывать и отменять keydown.
|
Сейчас попробовал вот так:
window.onscroll = null; Уже лучше. По-крайней мере одновременно перемещается и див, и скроллбар. Причем скроллбар перемещается на более меньший промежуток, но все равно заметно. |
Цитата:
|
И вот еще:
e.stop = function() { if (originalEvent.preventDefault) { originalEvent.preventDefault(); originalEvent.stopPropagation(); } else { originalEvent.returnValue = false; originalEvent.cancelBubble = true; } return e; }; Только переделать надо. |
Цитата:
|
В функции, которая прикреплена к document.onkeypress в самом конце return false;
А в самом начале: function (e) { if (e.preventDefault) { e.preventDefault(); e.stopPropagation(); } else { e.returnValue = false; e.cancelBubble = true; } |
Сейчас попробую.
Тыкнул в боди onscroll="scrollTo(0,0);". Не алло, т.е. не красиво. |
Ну что сказать?! Молодцы, парни! Каждому по +1.
Все работает аккуратно и красиво. |
Цитата:
зы: ничего, что на ты? |
Можно на "ты" =)
К сожалению, руководство не разрешает выкладывать инфу по разрабатываемому проекту. Типа коммерческая тайна и прочее. Но как только появится в Интернете первый сайт с этой разработкой - вас первых обеспечу необходимой ссылкой. Даю слово! |
Цитата:
|
А на русском есть мануалы по этим функциям? Чтобы полностью изучить области и задачи, для которых их уместно применять.
|
Цитата:
|
Цитата:
Цитата:
Только там, в предлагаемом коде, ошибка есть. Я писал о ней здесь: http://javascript.ru/forum/events/34...-sobytiyu.html, но никто не отреагировал. Цитата:
|
Цитата:
Еще времени не так много прошло, может админ работает над устранением этой ошибки. А в том примере, удаление обработчиков нормально работает? Без утечек? Можно применять? |
Цитата:
|
Часовой пояс GMT +3, время: 09:16. |