У меня есть список 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 здесь?