http://blagtalkan.ru
http://oktpoisk.ru
http://mysorru.ru/
http://san-okt.ru/
http://pes6evolution.ru/
http://chasikigov.ru
http://serafimsovet.ru
http://filmsgov.ru
http://free-domen.ru
http://fithonda.ru/forums/index.php
http://avtogov.ru
http://www.1001bilet.com.ua/base/on-line/
http://pravilavoini.ru
http://school41ufa.ru
http://rusrav4.ru
Обработка событий нажатия на клавиши | Книга AJAX
 

Разумеется, функция автодополнения должна быть привязана к собы-тяжм, возникающим в текстовом поле. Существует три различных со¬жития, которые связаны с клавиатурой: keydown, keypress и keyup. Собы-тке keydown возникает всякий раз, когда пользователь нажимает клави¬шу на клавиатуре, но раньше, чем произойдут какие-либо изменения ■текстовом поле. Вполне очевидно, что это событие не представляет джя нас никакого интереса, т. к. в случае его применения мы бы все аремя отставали на один символ. По тем же причинам не подходит нам ■событие keypress. Оно похоже на событие keydown, но возникает только в том случае, если нажата какая-либо символьная клавиша. И лишь событие keyup возникает после того, как изменения коснутся текстово-т поля, что в точности соответствует нашим потребностям.
Установка обработчика события текстового поля производится в два этапа: сначала необходимо определить функцию, а затем назначить ее
■ качестве обработчика события. Функция, которая фактически явля¬ется методом элемента управления автодополнением, называется tendleKeyUp(). Этот метод принимает в качестве аргумента объект event (порядок передачи события будет обсуждаться позже), на основе ана¬лиза которого принимается решение о том, надо ли задействовать функциональность автодополнения по нажатию данной клавиши. По¬скольку событие keyup возникает по нажатию не только на символь¬ные, но и на любые другие клавиши, мы будем принимать события при нажатии пользователем курсорных клавиш, клавиши табуляции
■ любых других клавиш на клавиатуре. Чтобы не вступать в конфликт етекстовым полем, подсказки должны производиться только по нажа-тюо на символьные клавиши. С этой целью мы обратимся к свойству eeyCode объекта event.
Свойство keyCode поддерживается большинством современных броузе¬ров (включая Internet Explorer для Windows и Macintosh, Firefox, Op¬era и Safari) и содержит числовой код, представляющий нажатую кла¬вишу. С помощью этого свойства можно задать поведение определен¬ных клавиш. Так как функция автодополнения должна задейство-ваться только по нажатию на символьные клавиши, прежде чем что-инбо предпринять, вы должны проверить значение этого свойства. Хо¬тите верьте, хотите нет, но самый простой способ заключается в том, чтобы определить клавиши, которые следует игнорировать. Такой ■одход эффективнее, поскольку символьных клавиш больше, чем не¬символьных. В следующей таблице приводится список кодов всех кла¬виш, которые следует игнорировать:
Вы наверняка заметили некоторую закономерность в расп] кодов клавиш. Все клавиши, которые нас не интересуют, имеют меньше 47 или попадают в диапазон 112-123. Правда, есть ключение - клавиша пробела с кодом 32. Таким образом, нам игнорировать клавиши с кодами меньшими 32 и в диапазонах и 112-123. Если код клавиши не попадает ни в один из этих нов, значит, это символьная клавиша.
Ниже приводится код метода handleKeyUp():
AutoSuggestControl.prototype;handieKeyllp = function (oEvent) { a
var iKeyCode = oEvent. keyCode; '" '
if (iKeyCode < 32 || (iKeyCode >= 33 && iKeyCode <= 46) || (iKeyCode >= 112 && iKeyCode .<= 123)) { // игнорировать this.provider.requestSuggestions(this);
■е аргумента передается ссылка на элемент управления автодополне-иием. Не забывайте, что это тот самый поставщик, который вызывает метод autosuggestO, описанный ранее. Метод requestSuggestionsO за¬пускает процесс получения списка подсказок.
Теперь этот метод надо назначить обработчиком события нажатия клавиш для текстового поля. Инициализировать механизмы управле¬ния лучше всего в отдельном методе. В нашем примере этой цели слу¬жит метод init():
AutoSuggestGontroliprototype.init = function () { ч var oThis = this;
S=... this, textbox. onkeyup = function (oEvent) {
У ^ if (JoEvent) <
j^- * oEvent = window.event;
g oThis.handleKeyUp(oEvent);

Метод init() начинается с создания ссылки на сам объект - this, чтобы ее можно было использовать позднее. Далее в качестве обработчика со¬бытия onkeyup текстового поля назначается анонимная функция, кото¬рая вызывает метод handleKeyllp() с помощью ссылки oThis. (Специаль¬ная ссылка this в этом случае будет указывать на само текстовое поле, а не на элемент управления автодополнением.)
Поскольку этот метод требует, чтобы ему передали в качестве аргумен¬та объект event, необходимо учитывать, что в DOM-совместимых бро¬узерах и в Internet Explorer этот объект передается обработчику по-разному. В DOM-совместимых броузерах объект event передается обра¬ботчику в виде входного аргумента, тогда как в Internet Explorer этот объект является свойством event объекта window. Вместо того чтобы проверять тип броузера, нам достаточно убедиться в наличии входного аргумента oEvent. Если входной аргумент отсутствует, значит, надо за¬писать ссылку на свойство window, event в переменную oEvent и передать ее методу handleKeyUp().
Метод init() должен вызываться из конструктора AutoSuggestControl:
function AutoSuggestControl(oTextbox, oProvider) { this.provider = oProvider; this.textbox = oTextbox; ,y this.init();
Это все, что требуется для реализации функции автоматического до¬полнения. К текущему моменту приложение уже сможет отображать единственную подсказку по мере того, как пользователь вводит симво¬лы. Но наша цель состоит не только в этом, нам надо еще отобразить список подсказок в виде выпадающего списка.

Когда пользователь нажимает символьную клавишу, необхо. действовать функцию автодополнения. Процесс начинается с метода поставщика подсказок requestSuggestions(), которому в