2012-01-18 2 views
1

вот мой код ... все, что я пытаюсь сделать, это отфильтровать с помощью jquery через «набор данных» записей, которые я вытаскиваю из базы данных.Код JQuery для фильтрации записей. лучшая техника/код

это мой код, но это ужасно неэффективно.

<script> 
$(document).ready(function(){ 
    $("#descriptionField").bind('keyup',function(e){ 
     var filter = $(this).val(); 
     if(filter) 
     { 
      $("#list").find("a:not(:contains(" + filter + "))").parent().slideUp(); 
      $("#list").find("a:contains(" + filter + ")").parent().slideDown(); 
     } 
    }); 
}); 
</script> 
+0

удалить slideUp и slideDown, и добавьте дроссель, чтобы он не запускался в режиме EVERY. –

+0

Это относится к http://codereview.stackexchange.com. – BalusC

+0

Просто интересно, почему это не было перемещено и вместо этого закрыто? – Jasper

ответ

1

Вы всегда можете кэшировать варианты, которые привыкают несколько раз:

$(function(){ 
    var $A = $('#list').find('a'); 
    $("#descriptionField").bind('keyup',function(e){ 
     var filter = this.value; 
     if(filter.length > 0) 
     { 
      $A.filter(":not(:contains(" + filter + "))").parent().hide(); 
      $A.filter(":contains(" + filter + ")").parent().show(); 
     } 
    }); 
}); 

Я снял мультипликационный slideDown() и slideUp() функция требует меньше процессора интенсивной show() и hide(). Кроме того, вместо использования jQuery для получения значения ввода, я использовал this.value, который должен быть немного быстрее.

Вместо того, чтобы использовать псевдо селекторы :not() и :contains() вы могли бы использовать filter() сделать это:

$(function(){ 
    var $A = $('#list').find('a'); 
    $("#descriptionField").bind('keyup',function(e){ 
     var filter = this.value; 
     if(filter.length > 0) 
     { 
      $A.filter(function() { 
       return ($(this).text().indexOf(filter) === -1) 
      }).parent().hide(); 
      $A.filter(function() { 
       return ($(this).text().indexOf(filter) > -1) 
      }).parent().show(); 
     } 
    }); 
}); 

Вот JSPerf, чтобы показать прирост производительности при использовании .filter() над :contains(): http://jsperf.com/jquery-contains-vs-filter

+0

Другой способ кэширования, который вы могли бы сделать, - создать объект за пределами привязки события, который хранит ранее использованные ключевые слова фильтра. Если фильтр уже выполнен, отобразите и скройте, используя выбранные элементы из этого фильтра. –

+0

Я заменил slideUp и вниз для показа и скрытия. очень быстро. только то, в чем мы нуждались. Большое вам спасибо за вашу помощь. –

+0

@Tony Добро пожаловать. Если вы измените подход '.filter()', вы получите еще один бамп производительности. – Jasper

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