2010-01-25 5 views
9

Это скорее вопрос любопытства. При выполнении следующих действий:Производительность jQuery при выборе нескольких элементов

$('.selector1, .selector2').doSomething() 

ли JQuery полностью пройти через DOM дважды, чтобы получить каждый набор объектов, соответствующих каждый селектор или это найти все элементы в одном обходе DOM?

+0

Я не думаю, что из-за того, что видно из ядра, матчи выполняются с регулярным выражением по различным свойствам узла (nodeName, NodeType, id и т. Д.). Таким образом, любой одиночный селектор создает одну итерацию DOM. Тем не менее, Im не на 100% положителен на этом, поэтому я отдам другим, более знакомым с внутренними :-) – prodigitalson

+0

на самом деле пример плохой, потому что '' узел не существует в HTML :) –

+0

Я думаю, что вы хотите сделать найдите механизм выбора, Sizzle, исходный код которого вы можете посмотреть: http://github.com/jeresig/sizzle/ http://github.com/jeresig/sizzle/blob/master/sizzle.js – artlung

ответ

1

Я думаю, что он использует встроенные функции браузера, чтобы найти это, используя:

document.getElementsByClassName() 
1

Это действительно зависит от браузера. В новых браузерах он будет использовать document.querySelectorAll для любых запросов DOM (под капотом это вызывает document.getElementsByClassName для классов). В более старых браузерах, которые этого не поддерживают, необходимо выяснить это самостоятельно, что, очевидно, будет медленнее.

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

+0

Кажется, что в большинстве случаев каждый раз для каждого селектора он будет проходить DOM каждый раз. Хотя как это происходит, DOM будет отличаться в зависимости от типа селектора (элемент против ID против класса)? –

+0

Да, он будет использовать регулярное выражение, чтобы разбить все ваши запросы и выполнить их по одному за раз. Однако я бы не стал беспокоиться о производительности для классов или идентификаторов. –

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