Какой из селекторов будет оптимальнее, в плане производительности?

130
14 октября 2019, 12:50

Какая из этих процедур менее ресурсозатратна?

var content = $('.kb-content');
content.each(function () {
    if ($(this).data('parent-id') === targetId) {
        $(this).toggleClass('hidden');
    }
});

или

$('.kb-content[data-parent-id="' + targetId +'"]').toggleClass('hidden');
Answer 1

jQuery для выборки элементов использует библиотеку Sizzle. Эта библиотека разбирает переданную строку и для простых случаев использует стандартные функции get*By*, либо, в случае поддержки использует querySelectorAll.

Можно рассмотреть, что именно происходит в первом и втором случаях.

Первый случай:

  1. $('.kb-content'); - выборка всех элементов с классом kb-content
  2. content.each(function () { - проход по каждому элементу
  3. if ($(this).data('parent-id') === targetId) { - создание объекта jQuery, обращение к data, сравнение с параметром
  4. $(this).toggleClass('hidden'); - создание объекта jQuery, смена класса

Второй случай:

  1. $('.kb-content[data-parent-id="' + targetId +'"]') - выборка элементов с классом kb-content у которых атрибут data-parent-id - имеет соответствующее значение
  2. .toggleClass('hidden'); - проход по каждому элементу и смена класса

Можно заметить как минимум два отличия:

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

Таким образом, если среди элементов с классом kb-content элементов с требуемым атрибутом будет сильно меньше, то вариант с выборкой по атрибуту будет выполняться быстрее, в силу того, что таких элементов будет меньше.

Также на скорость влияет множественное создание объектов jQuery.

Пример тестов, подтверждающих рассуждения выше.

READ ALSO
FCM. Подписать и сохранить токен

FCM. Подписать и сохранить токен

Как на JavaScript подписать пользователя на уведомления FCM и получить Push-token для сохранения в БД?

102
как найти что меняет линки

как найти что меняет линки

Есть через ухо написанный сайт, намешанно в нем дофигаВ итоге при установке google analytics нифига не работает

289
Сохранение blob на Google Drive

Сохранение blob на Google Drive

Столкнулся с проблемой при сохранении текстового файла на гугл диск Есть кнопка

209
Адаптивный js show more

Адаптивный js show more

Имеется много стандартных решений show more на javascript, но все (или почти все) из них подразумевают статичную высоту и ширину скрываемого текстаКак...

148