Подтвердить что ты не робот

Как можно реализовать функции поиска/поиска, используя Dojo?

Я хочу реализовать функцию "прямой поиск" или "поиск предложений" в веб-приложении, использующем Dojo Framework. Это было бы похоже на то, как поисковые запросы Google и Bing отображались по мере ввода: при вводе в поле поиска список потенциальных совпадений приведен ниже. Поиски будут выполняться на стороне сервера, а результаты будут отправлены обратно в браузер с помощью AJAX.

Кто-нибудь знает хороший способ реализовать это с помощью Dojo?

Вот несколько возможных вариантов:

  • Встроенный виджет dijit.form.ComboBox
    Это очень похоже на функциональность, но я видел, что она используется с ограниченными наборами данных. В примерах всегда используются небольшие списки (например, 50 штатов в США) и предварительно загружают весь набор данных для фильтрации на стороне клиента. Однако я предполагаю, что могу подключить его к dojox.data.JsonQueryRestStore для поиска на стороне сервера - может ли кто-нибудь подтвердить, работает ли это?

  • QueryBox http://marumushi.com/code/querybox/
    Эта реализация в основном выполняет эту работу, но она содержит некоторые незначительные ошибки и не похожа на ее поддержку. Мне нужно будет сделать некоторые исправления в коде перед его использованием.

  • Medryx http://blog.medryx.org/2008/09/10/dijitsearch-part-2/
    Это также похоже на то, что он выполняет эту работу, но описывается как код "альфа-уровня", и ссылка на код кажется сломанной...

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

4b9b3361

Ответ 1

Я реализовал его 5 лет назад, когда Dojo составлял 0,2:

Пока код древний, это тривиально, и, надеюсь, он даст вам идеи о том, как атаковать его. Грубый эскиз:

  • Прикрепите обработчик событий к вашему ящику ввода, который запускается при изменениях — используйте "onkeyup", чтобы обнаружить изменение в поле ввода.
  • Подождите, пока пользователь не перестанет печатать, установив таймер в обработчике событий, если он еще не установлен. 200-500 мс - хорошее время ожидания.
    • Тайм-аут играет двойную роль:
      • Он блокирует наши запросы на сервер, чтобы предотвратить перегрузку.
      • Он играет на нашем восприятии времени и наших типизирующих привычках.
  • Если наш тайм-аут завершен, и мы не дождаемся сервера → отправьте сервер, который у нас есть до сих пор.
  • Если мы все еще ждем сервера, отмените запрос и спросите еще раз.
    • Эта часть специфична для приложения: мы не хотим перегружать сервер, а иногда сервер не может нормально работать с поврежденными соединениями.
    • В этом примере я не отменю вызов XHR, но дождитесь его завершения, прежде чем отправлять новый запрос.
  • Сервер отвечает соответствующими результатами, которые отображаются в кратчайшие сроки.

В блоге я реализовал его как виджет. Очевидно, что точная упаковка зависит от вас.