2011-12-24 3 views
0

Я использую следующий скрипт, чтобы отфильтровать divs, которые не содержат текст во входящих. (По аналогии с друзьями на Facebook Закладка)Запуск события на KeyPress слишком загружается CPU

$('#friend_search_form input').keyup(function(){ 
    var $searchString = $(this).val(); 
    $('.buddy').show(); 
    $('.buddy_name > a:contains('+$searchString+')').closest('.buddy').hide(); 
    console.log($searchString); 
}) 

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

Каков наилучший способ написать это?

+0

Возможно, это лучший вопрос для http://s.tk/review. –

ответ

3

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

var typingTimeout; 

$('#friend_search_form input').keyup(function(e) { 
    if (typingTimeout != undefined) { 
    clearTimeout(typingTimeout); 
    } 

    typingTimeout = setTimeout(function() {   
    var $searchString = $(this).val(); 

    $('.buddy').show(); 
    $('.buddy_name > a:contains('+$searchString+')').closest('.buddy').hide(); 
    console.log($searchString); 
    }, 500); 
}); 
+0

Альтернативно, [используйте плагин] (http://benalman.com/projects/jquery-throttle-debounce-plugin/). Правда, идея об отказе - это правильная идея. –

+0

получение этой ошибки 'e.nodeName undefined' –

+0

Попробуйте плагин @ MДΓΓБДLL. Поскольку у меня нет демо для тестирования этого кода, я пишу его вслепую. – Blender

0

Использование только имя класса в качестве селектора способ медленнее, чем, например, удостоверение личности или даже указав имя тега, а также класс. Вы также можете сузить селектор, начиная с идентификатора, примерно так: $('#buddies div.buddy'); (сразу же находит элемент #buddies, тогда ему нужно только сопоставить имена классов элемента), а не только $('.buddy') (который проходит через каждый элемент на странице и пытается совместить имя класса).

Смежные вопросы