У меня есть список HTML около 500 элементов и поле «фильтр» над ним. Я начал с использования jQuery для фильтрации списка, когда набирал букву (код синхронизации добавлен позже):
$('#filter').keyup( function() {
var jqStart = (new Date).getTime();
var search = $(this).val().toLowerCase();
var $list = $('ul.ablist > li');
$list.each( function() {
if ( $(this).text().toLowerCase().indexOf(search) === -1 )
$(this).hide();
else
$(this).show();
} );
console.log('Time: ' + ((new Date).getTime() - jqStart));
} );
Однако после ввода каждой буквы произошла задержка в пару секунд (особенно первая буква). Поэтому я подумал, что это может быть немного быстрее, если я использую простой Javascript (я недавно прочитал, что функция jQuery each
особенно медленная). Вот мой эквивалент JS:
document.getElementById('filter').addEventListener( 'keyup', function () {
var jsStart = (new Date).getTime();
var search = this.value.toLowerCase();
var list = document.querySelectorAll('ul.ablist > li');
for ( var i = 0; i < list.length; i++ )
{
if ( list[i].innerText.toLowerCase().indexOf(search) === -1 )
list[i].style.display = 'none';
else
list[i].style.display = 'block';
}
console.log('Time: ' + ((new Date).getTime() - jsStart));
}, false );
Однако, к моему удивлению, простой Javascript в 10 раз медленнее , чем эквивалент jQuery. Версия jQuery фильтруется по каждой букве за 2-3 секунды, а версия Javascript - более 17 секунд! Я использую Google Chrome в Ubuntu Linux.
Это не для чего-то действительно важного, поэтому оно не должно быть супер эффективным. Но я делаю что-то действительно глупое с моим Javascript здесь?