привет я реализую живой поиск (=search, поскольку Вы вводите), функция в моем веб-приложении. в настоящее время я использую keyup событие для отправки поискового запроса с помощью сообщения ajax, например.
$('#SearchField').keyup(function(e) {
$.post(
...
);
});
но это приводит к некоторой проблеме задержки, в некоторых случаях когда я ищу, например, после "проблемы", ответа для "про" шоу путь после ответа для "проблемы", и перезаписывает корректный результат поиска с путем к большому результату.
каков был бы хороший подход для борьбы с этим поведением?
tia
вы можете прервать предыдущий запрос
var xhr = null;
$('#SearchField').keyup(function(e) {
if (xhr !== null) xhr.abort ();
xhr = $.post(
...
);
});
или установить идентификатор для каждого запроса. Когда запрос завершен, если уже пришел ответ с большим id, игнорируйте ответ. В противном случае, сохраните id.
Большинство автозаполнителей не заменяют вводимый пользователем текст - они показывают возможные варианты в выпадающем списке, который пользователь может выбрать.
Вот прекрасный пример уже хорошо написанного автозавершения: http://view.jquery.com/trunk/plugins/autocomplete/demo/
Я реализовал «живой поиск» один раз и использовал тайм-аут, чтобы начать поиск только после того, как нет ввода для период времени (полсекунды или около того). Таким образом, поиск будет запускаться только в том случае, если пользователь перестанет печатать, уменьшая задержку результатов и нагрузку на сервер.
В вашем случае я бы проверил, продолжал ли пользователь вводить текст и не отправлял ли поисковый запрос или не отображал какой-либо «старый» результат, поступивший с опозданием.
Как вы уже поняли, существует множество сложных вопросов, связанных с пользовательским интерфейсом (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/
$('#SearchField').keyup(function(e) {
t = setTimeout(function(){
$.post(
...
);
},1000);
});
С этим кодом ваша функция будет выполнена через 1000 мс. Если клавиатурное нажатие будет запущено снова, переменная будет перезаписана, и первая функция будет фактически отменена. Другими словами, весь пост не будет выполнен до тех пор, пока пользователь не перестанет печатать на 1 секунду.
Самый простой способ - предоставить функтор, который используется алгоритмом сортировки
для сравнения двух значений. Вы можете написать так:
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 менеджер плагин доступен, который работает хорошо (мне нужно что-то немного более сложный, так что я написал свой собственный). можно установить номер очереди, прервать новый вызов и т. д. Таким образом ничего не запрашивается до окончательного пользовательского ввода