Самый быстрый метод выбора в jquery и CSS - ID или нет?
Что самое быстрое в jquery/javascript?
$('#myID .myClass')
или
$('.myClass')
Что лучше всего использовать в CSS?
#myID .myClass{}
или
.myClass{}
Теперь я вижу, что лучше объяснить. Извините!
Ofceauce ID - более быстрый селектор как в CSS, так и в JavaScript. Но иногда вам нужно использовать класс, поскольку есть несколько селекторов.
Скажем, например, что у меня есть документ BIG html. В середине страницы у меня есть:
<div id="myID">
<a class="myClass">link1</a>
<a class="myClass">link1</a>
<a class="myClass">link1</a>
</div>
Если я хочу настроить таргетинг на все "myClass". Было бы лучше настроить таргетинг на идентификатор до таргетинга на классы? (тогда мне не пришлось бы делать domtravel всего HTML-документа) Например:
Будет ли это:
$( '# MyId'). Найти (". MyClass')
Быстрее, чем:
$(". MyClass')
Ответы
Ответ 1
My testing в современных браузерах предполагает, что вы должны пойти либо с помощью
$('#id').find('.class') // or
$('.class')
но не,
$('#id .class')
Причина в том, что все современные браузеры реализуют getElementsByClassName
, что приводит к почти постоянному поиску по времени по имени класса (при условии реализации хэша). Какие современные браузеры - это еще один субъективный вопрос.
Ответ 2
Они примерно одинаковы в большинстве современных браузеров, так как имена классов хэшируются внутри. Разница в том, что у старых браузеров нет .getElementsByClassName
или эквивалентного метода, поэтому .myClass
анализируется внутри jQuery, а элемент EVERY в dom идет и проверяется для имени класса (или он использует XPath, когда это возможно).
Всегда старайтесь использовать #myID .myClass
, когда это возможно, поскольку это позволяет jQuery напрямую перейти на #myID
и проходить там, когда это необходимо.
Ответ 3
Подумайте логически об этом в течение секунды и притворитесь, что вы ничего не знаете о том, как браузер встроен или как он обращается к DOM, но вы предполагаете, что все, что он делает, логично.
Следовательно, разве не стоит рассуждать, что из двух селекторов самый узкий результат будет быстрее?
У вас есть два селектора, которые переводят на грубый английский как
- Любой элемент класса
myClass
, являющийся дочерним элементом элемента с идентификатором myID
- Любой элемент класса
myClass
Что касается "Что лучше всего использовать в CSS", это полностью субъективно, поскольку это зависит от того, собираетесь ли вы нацеливать все экземпляры .myClass
или только те, которые являются дочерними элементами #myID
.
Ответ 4
Хороший вопрос на самом деле.
Скажем, вы проанализировали DOM из N элементов максимальной глубины D и CSS из числа S правил. Тогда задача поиска стилей для всех элементов имеет вычислительную сложность примерно O(N*D*S)
.
Очевидно, что не все селектора CSS имеют одинаковую сложность вычислений.
Например, селектор li.item
и li[class ~= "item"]
требуют ровно столько же ресурсов ЦП, сколько они эквивалентны. li[class = "item"]
может быть вычислен быстрее, так как он не требует сканирования пробелов.
# 1:
#myID .myClass{} /* #1 */
.myClass{} /* #2 */
требуется больше ресурсов ЦП, так как вам нужно выполнить ту же работу, что и в случае №2, плюс вам нужно будет отсканировать родительскую/дочернюю цепочку (из максимальных элементов D), чтобы найти элемент с "myID".
Это все о чистых селекторах CSS.
В jQuery и друзья ситуация может быть немного иной. Теоретически механизм jQuery может использовать document.getElementById()
для минимизации набора поиска (поэтому уменьшите число N), но это не будет соответствовать поведению CSS. Вот пример: http://jsfiddle.net/dnsUF/. Здесь jQuery сообщает один элемент с #foo
, но на самом деле есть два таких элемента.
Резюме:
- В случае CSS # 2 быстрее
- В jQuery случае # 1 может быть быстрее (но технически это может быть неверно в смысле CSS).
Вот моя статья о сложности селектора CSS:
http://www.terrainformatica.com/2008/07/csss-and-computational-complexity-of-selectors/
И это один из способов улучшить его с помощью наборов стилей:
http://www.terrainformatica.com/2010/09/style-sets-in-h-smile-core/
Ответ 5
Идентификаторы всегда будут самым быстрым способом доступа к элементу, поскольку они уникальны.
Ответ 6
Да, id - один из самых быстрых способов доступа к элементу. Проверьте этот тест http://mootools.net/slickspeed/.
Ответ 7
#myID .myClass
, безусловно, лучший способ получить доступ к элементу, предполагая, что у вас много элементов, к которым применяется .myClass
.
Ответ 8
Обновление - 2015 - Проверьте себя здесь
https://jsperf.com/id-vs-class-vs-tag-selectors/2
TL; DR;
Использование ID $( "# foo" ) почти в 4 раза быстрее, чем CSS $( ". bar" ) на моем chrome 41 на linux 64bits