2012-05-03 8 views
3

Есть много вопросов о том, быстрее или быстрее найти элемент через класс или идентификатор или какой-либо другой селектор. Меня это не интересует. Я хочу знать, если у вас есть:Быстрее пересечь DOM из кэшированного селектора, чем найти элемент ID'd в DOM?

var link = $(this); //let's say you're in a click handler 

Является ли это быстрее, чтобы найти контейнер, делая

var container = link.closest('.container'); //assume container is .container 

или

var container = $('#mycontainer'); //assume same element as above 

Я задаю этот вопрос не только для конкретного сценарий выше (хорошо, да, да, для этого сценария тоже), но для кэширования обхода против создания нового объекта jQuery, у которого есть идентификатор. Я замечаю, что во многих своих кодах я стараюсь использовать прежний метод (поскольку он может приспособиться к более динамичному), но мне всегда было любопытно, если бы это было быстрее, чтобы сделать это последним.

Благодаря

+2

Мое подозрение, что последнее быстрее, но вы его протестировали? Было бы довольно легко выбить тестовую упряжь ... –

+0

Я не уверен, что эта информация устарела и исправлена ​​с помощью самых последних итераций jQuery, но я уверен, что '.closest()' относительно чем другие альтернативы. –

+1

На самом деле я создал jsperf: http://jsperf.com/cached-dom-traversal-vs-new-id-selection выглядит как идентификатор, безусловно, самый быстрый, поиск по классу следующий. – Jason

ответ

2

Я думаю, что, кэшируются селектор или нет, это будет быстрее использовать селектор ID. Селектор ID в значительной степени представляет собой прямой поиск в словаре по сравнению с кэшированной/ближайшей комбинацией, которая похожа на поиск в словаре, а затем на обход дерева.

http://jsperf.com/traverse-from-cached-selector-vs-id-selector

Самый быстрый поиск будет сделано с родной функции documentGetElementById.

var container = $(document.getElementById('MyContainer')); 
+0

похоже, что обход дерева обычно медленнее, что заставляет меня задаться вопросом, как хорошо использовать кешированный объект, а затем переходить с ... – Jason

+0

Когда дело доходит до прохождения, я обычно использую кешированные объекты для поиска коллекций дочерних элементов. то есть '$ cachedObject.find ('. untoggled-children'). toggle(). toggleClass ('untoggled-children toggled-children');' Но когда дело доходит до нахождения одного элемента, у которого есть id, я всегда будет использовать '$ (document.getElementById ('myid'))'. – jeremysawesome