2013-12-04 2 views
2

У меня возникла ситуация, когда мне интересно, какой лучший подход подходит для производительности.jQuery class selector vs cached element + find

У меня есть название класса, назовем его .class-test. У меня также есть кешированный элемент, $ body.

можно либо извлечь .class-тест элемент по:

$('.class-test') 

или

$body.find('.class-test') 

В наихудшем сценарии, делает один из этих подходов верх над другой? Кроме того, если кто-то может описать, что делается под капотом, второй подход, который был бы велик (т. Е. Я знаю, что .find подчиняется Sizzle, но если элемент кэширован, у него уже есть дерево его элементов DOM, то нужно только пересечь это поддерево, чтобы найти класс? или это дерево только построено по мере необходимости?).

+0

Попробуйте здесь http://jsperf.com/ – elclanrs

+1

Если вы не смотрите на тысячи элементов, вы никогда не заметите разницы. – adeneo

+0

Да, именно поэтому я сказал худший случай. Поскольку большинство показателей производительности jQuery основаны на использовании тысяч элементов. Мне также было бы интересно узнать, что происходит под капотом второго подхода. – Leonidas

ответ

0

Разница в том, сколько раз вы погружаетесь в пул DOM, так сказать. В первом запросе jQuery будет искать внутри документа (верхний уровень) и перемещаться вниз в дерево DOM, проверяя каждый уровень до тех пор, пока он не дойдет до самого конца, а затем вернет все соответствующие элементы.

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

Когда вы углубляетесь в дерево DOM, это может быть большой заставкой. Вы можете сэкономить от 10 до 100 уровней проверки уровня. И хотя вы не заметите этого на небольших сайтах, в один прекрасный день вы можете работать с базами кода уровня предприятия, где эти выгоды от производительности будут очень полезны для вас.

+0

Да, это то, что я думал и почему я всегда стараюсь кэшировать свои элементы и использовать find. Я предполагаю, что я действительно должен был спросить: кеширование элемента означает, что мы храним его структуру DOM в памяти, что, я думаю, это то, что происходит, поэтому, когда я ссылаюсь на этот кешированный элемент с помощью метода «найти», мы не делаем должны инициализировать дерево DOM кэшированного элемента перед выполнением «find». – Leonidas

+0

и просто для уточнения jquery использует запрос querySelector по умолчанию и querySelectorAll в современных браузерах и полагается на Sizzle (их механизм выбора) для старых браузеров. – kkemple

+0

Не «найти» специально отложить до Sizzle.find? – Leonidas

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