Какой тип алгоритма использует элемент HTML SELECT для отображения результатов при вводе? - PullRequest
1 голос
/ 21 января 2010

Я пытаюсь реплицировать элемент HTML SELECT (раскрывающийся список или выпадающий список) во Flash (AS3).

В большинстве браузеров, когда один из них находится в фокусе и вы что-то набираете, комбинированный список пытается найти значение в его параметрах и показать ближайший. Мне было интересно, какой алгоритм используется для этого. Я не думаю, что это Левенштейн или аналогичный, поскольку он работает только с началом строки.

Я думаю, что он работает, сохраняя буфер того, что было написано, и пытается найти строку, начинающуюся с этого ... если он ничего не находит, он очищает буфер и ищет начало строки с последним нажатым символом.

Я уже создал этот прототип, и он работает вполне нормально, с одной оговоркой ... В HTML, когда вы несколько раз нажимаете одну и ту же клавишу, он будет вращаться между всеми опциями, начинающимися с этого символа. Я думаю, что мог бы это исправить, но мне было интересно, если кто-то уже сделал это, чтобы сравнить алгоритмы ... это превращается в довольно сложный код для тестирования и отладки, и я не уверен, что раскрываю все возможности. ..

Ответы [ 4 ]

4 голосов
/ 21 января 2010

Реакция виджетов форм на взаимодействие с клавиатурой не стандартизирована, и разные браузеры не согласны. Это всегда проблема при создании элементов управления формы ersatz из скрипта.

В HTML, когда вы несколько раз нажимаете одну и ту же клавишу, он будет переключаться между всеми опциями, начинающимися с этого символа.

Эта функция взята из Windows и довольно неинтуитивна. Точное правило не совсем так, оно довольно неясно и дает разные результаты в IE и Opera по сравнению с другими браузерами.

ИМО такое поведение крайне нежелательно. Поскольку ни один средний пользователь не сможет предсказать, как работает правило, я лично опущу его и просто выберу первый вариант, соответствующий набранной левой строке. Это легче для вас, чтобы кодировать и проще для пользователя.

2 голосов
/ 21 января 2010

Только что провёл несколько тестов на firefox, и я заметил (это не официальная информация, просто спекуляция):

  • Key нажатие события:
    • Esc (только Firefox): очистить буфер
    • Стрелка вверх / вниз: перемещение вверх / вниз по списку, очистка буфера
    • Страница вверх / вниз: переместиться вверх / вниз на 20 в списке, очистить буфер
    • Домой: переместиться в начало списка, очистить буфер
    • Конец: переместиться в конец списка, очистить буфер
    • Другое:
      • Пустой буфер?
        • Да: добавить key в буфер
      • buffer.length == 1 И key соответствует последней нажатой клавише?
        • Да: перейти к следующему пункту, начиная с key.
        • Нет: добавьте key к buffer и найдите следующий элемент, начиная с buffer.
  • 1,5 секунды прошло событие: очистить буфер

Конечно, для этого потребуется таймер.

0 голосов
/ 21 января 2010

В HTML, когда вы несколько раз нажимаете одну и ту же клавишу, он будет переключаться между всеми параметрами, начиная с этого символа.Я думаю, что мог бы это исправить, но мне было интересно, если кто-то уже сделал это, чтобы сравнить алгоритмы

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

0 голосов
/ 21 января 2010

Я не знаю, какой алгоритм используется в браузерах, но приходит на ум тот, который будет делать то, что вы хотите, это выравнивание последовательности или самый длинный алгоритм общей подпоследовательности. Это позволит вам сопоставить любую часть строки с любой другой частью строки (с возможными пробелами между соответствующими подстроками). Это не очень быстро, хотя.

http://en.wikipedia.org/wiki/Sequence_alignment

есть также несколько очень хороших видео лекций онлайн в открытой программе MIT

http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-046JFall-2005/VideoLectures/detail/embed15.htm

...