Вот некоторый jQuery для поля поиска, которое я ожидаю, на самом деле антишаблон и уверен, что существует намного лучшее решение, для которого я хотел бы быть указанным к:
Я опишу, это в комментариях затем просто дает код, так как комментарии могут быть более четкими и простыми, чем код:
Код:
// set up a filter function call on keypress.
$('#supplier-select-filter').keypress(function (){
// Currently, resets a delay on an eventual filtering action every keypress.
filterSuppliers(.3, this);
});
// Delayed filter that kills all previous filter request.
function filterSuppliers(delay, inputbox){
if(undefined != typeof(document.global_filter_trigger)){
clearTimeout(document.global_filter_trigger);
// clearTimeout any pre-existing pointers.
}
// Use a global to store the setTimeout pointer.
document.global_filter_trigger = setTimeout(function (){
var mask = $(inputbox).val();
$('#user_id').load("supplier.php?action=ajax_getsuppliers_html&mask="+escape(mask));
}, 1000*delay);
// Finally, after delay is reached, display the filter results.
}
На поле ввода, где критерий поиска может состоять из 10 символов в среднем, это - 10 вызовов к setTimeout в половине второго, который, кажется, тяжелый процессор, и в моем тестировании вызывает некоторые значимые проблемы производительности, так надо надеяться, существует более чистая альтернатива?
.load () более прост, чем взятие в JSON и затем генерация HTML от json, но возможно существует лучший инструмент?
.keypress (), кажется, всегда не включает вещи как удаление клавиши Backspace и другие основы, поэтому возможно, использование нажатия клавиши () на этом поле ввода не является идеалом?
Я часто использую следующий подход, простую функцию для выполнения обратного вызова после того, как пользователь перестал печатать в течение определенного времени ::
$(selector).keyup(function () {
typewatch(function () {
// executed only 500 ms after the last keyup event.
}, 500);
});
Реализация:
var typewatch = (function(){
var timer = 0;
return function(callback, ms){
clearTimeout (timer);
timer = setTimeout(callback, ms);
};
})();
Я думаю, что этот подход очень прост, и он не подразумевает никаких глобальных переменных.
Для более сложных применений обратите внимание на плагин jQuery TypeWatch .