Как Вы решаете проблему “задержки” живого поиска?

привет я реализую живой поиск (=search, поскольку Вы вводите), функция в моем веб-приложении. в настоящее время я использую keyup событие для отправки поискового запроса с помощью сообщения ajax, например.

$('#SearchField').keyup(function(e) {
        $.post(
           ...
        );
});

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

каков был бы хороший подход для борьбы с этим поведением?

tia

5
задан marc.d 19 February 2010 в 14:45
поделиться

6 ответов

вы можете прервать предыдущий запрос

var xhr = null;
$('#SearchField').keyup(function(e) {
  if (xhr !== null) xhr.abort ();
  xhr = $.post(
    ...
  );
});

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

5
ответ дан 13 December 2019 в 19:26
поделиться

Большинство автозаполнителей не заменяют вводимый пользователем текст - они показывают возможные варианты в выпадающем списке, который пользователь может выбрать.

Вот прекрасный пример уже хорошо написанного автозавершения: http://view.jquery.com/trunk/plugins/autocomplete/demo/

1
ответ дан 13 December 2019 в 19:26
поделиться

Я реализовал «живой поиск» один раз и использовал тайм-аут, чтобы начать поиск только после того, как нет ввода для период времени (полсекунды или около того). Таким образом, поиск будет запускаться только в том случае, если пользователь перестанет печатать, уменьшая задержку результатов и нагрузку на сервер.

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

3
ответ дан 13 December 2019 в 19:26
поделиться

Как вы уже поняли, существует множество сложных вопросов, связанных с пользовательским интерфейсом (UI) или UX (User Experience) при создании отличного живого поиска.

Я оставляю тяжелую работу по тестированию UI/UX людям из Yahoo, которые разработали автоматический полный контроль, используемый ими на своих веб-сайтах. А еще лучше то, что они выпустили его с открытым исходным кодом: http://developer.yahoo.com/yui/autocomplete/

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

Есть также хорошая статья о том, как Flickr использует автозаполнение Yaho для реализации поиска на странице: http://code.flickr. com/blog/2009/03/18/building-fast-client-side-searches/

1
ответ дан 13 December 2019 в 19:26
поделиться
$('#SearchField').keyup(function(e) {
  t = setTimeout(function(){        
    $.post(
           ...
    );
  },1000);
});

С этим кодом ваша функция будет выполнена через 1000 мс. Если клавиатурное нажатие будет запущено снова, переменная будет перезаписана, и первая функция будет фактически отменена. Другими словами, весь пост не будет выполнен до тех пор, пока пользователь не перестанет печатать на 1 секунду.

1
ответ дан 13 December 2019 в 19:26
поделиться

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

struct Compare
{
  bool operator()(double* first, double* second) const
 {
   //Compare points here
 }
};

И используйте как:

std::sort(p.begin(), p.end(), Compare());

EDIT для комментария OP : Да, этот пример кода компилирует хорошо:

class A
{
public:
    struct c
    {
        bool operator()(int a, int b) const
        {
            return a < b;
        }
    };
};
int main()
{
    std::vector<int> a1;
    a1.push_back(2);
    a1.push_back(1);
    std::sort(a1.begin(), a1.end(), A::c());

    return 0;
}
-121--4648296-

Может быть глупо, но попробуйте ввести только "myscript.py" в cmd.exe, если вы находитесь в Windows. Я заметил, что в Windows не нужно вводить "python" перед именем сценария. Это, конечно, для стандартной установки CPython в Windows.

-121--4817465-

хитрость заключается в использовании прерываний и очередей ajax, я написал пользовательскую библиотеку для живого поиска, который я создал, фильтрует через 20 миллионов записей, таких как масло (предоставленные оптимизированные таблицы eav помогают со скоростями запросов). Есть также jquery ajax менеджер плагин доступен, который работает хорошо (мне нужно что-то немного более сложный, так что я написал свой собственный). можно установить номер очереди, прервать новый вызов и т. д. Таким образом ничего не запрашивается до окончательного пользовательского ввода

0
ответ дан 13 December 2019 в 19:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: