Идиоматический jQuery задержал событие (только после короткой паузы во вводе)? (иначе timewatch/typewatch/keywatch)

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

Я опишу, это в комментариях затем просто дает код, так как комментарии могут быть более четкими и простыми, чем код:

  • //настройте вызов функции на нажатии клавиши.
  • //вызов функции имеет задержку, прежде чем основное событие будет иметь место.
  • //Когда функция нажатия клавиши будет вызвана, вытрите любые ранее события с очередями и сделайте новое на стандартном уровне задержки.
  • //Используйте глобальное для хранения setTimeout указателя.
  • //clearTimeout любые существующие ранее указатели.
  • //Запустите новую задержку.

Код:

                // 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 и другие основы, поэтому возможно, использование нажатия клавиши () на этом поле ввода не является идеалом?

33
задан Kzqai 8 February 2016 в 00:25
поделиться

1 ответ

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

$(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 .

96
ответ дан 27 November 2019 в 17:36
поделиться
Другие вопросы по тегам:

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