Page 33 - jQuery для начинающих
P. 33
);
return results;
} catch(qsaError) { /* подвёл, опять, ну сколько можно */ }
/* ... */
// выход Sizzle
return oldSelect( selector, context, results, seed, xml );
};
Но давайте уже рассмотрим, как Sizzle ищет в DOM'е, если таки метод querySelectorAll
споткнулся. Начнём с разбора алгоритма работы на следующем примере:
$("thead > .active, tbody > .active")
1. Получить первое выражение до запятой: «thead > .active»
2. Разбить на кусочки: «thead», «>», «.active»
3. Найти исходное множество элементов по последнему кусочку (все «.active»)
4. Фильтровать справа налево (все «.active» которые находятся непосредственно в
«thead»)
5. Искать следующий запрос после запятой (возвращаемся к первому пункту)
6. Оставить только уникальные элементы в результате
Глядя на данный алгоритм вы должны заметить, что правила читаются справа на лево!
Копаем глубже. При анализе даже самого маленького выражения есть несколько нюансов
на которые стоит обратить внимание – первый – это приоритет поиска, он различен для
различных браузеров (в зависимости от их возможностей, или «невозможностей»):
order: new RegExp( "ID|TAG" +
(assertUsableName ? "|NAME" : "") +
(assertUsableClassName ? "|CLASS" : "")
)
Не обращайте внимание на RegExp – это внутренняя кухня Sizzle
33
www.trk.kg