Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
$(this).find('.value:first')$('#divs .my_class') — увы, такие конструкции тоже могут ощутимо тормозить, хотя, как написано, и должен сперва искаться id.$('#div').find('.my_class')$('#my_form input[type=«hidden»]')Оба селектора будут использовать qSA, во втором случае sizzle перепишет
$('#my_form input[type=hidden]')
В большинстве случаев их хватает, но (sic!) в IE7 getElementByClass() поломана и использование селектора по классу приведёт к польному перебору элементов в этом браузере.getElementsByClassName, был добавлен только в девятом ie (sic!).
$('.divs', document.getElementById('wrapper'));В спецификации querySelectorAll есть своеобразный баг —
document.getElementById('wrapper').querySelectorAll('.divs'); // при наличии возможности использовать querySelectorAll()
document.getElementById('wrapper').querySelectorAll('#wrapper .divs');$('.child', $('.root')[0]); // использование контекста не облегчит поискОблегчит.
$('.root').children('.child'); // самый правильный вариантЭто не самый правильный вариант, это единственно правильный вариант.
$('.root > .child')
var Expr = Sizzle.selectors = {
...
relative: {
...
">": function( checkSet, part ) {
...
Sizzle.filter( part, checkSet, true ); // тут обрабатывается магия ">"
...
}
...
}
...
}
// А вот метод .children()
children: function( elem ) {
return jQuery.sibling( elem.firstChild );
}
sibling: function( n, elem ) {
var r = [];
for ( ; n; n = n.nextSibling ) {
if ( n.nodeType === 1 && n !== elem ) {
r.push( n );
}
}
return r;
}
Работает данная функция не во всех браузерах, а только в FF 3.1+, IE8+ (только в стандартном режиме IE8), и Safari 3.1+А «Оперу» почему не включили в этот список? Она тоже поддерживает эти вызовы.
Как мы знаем — разбор селектора и поиск начнётся со всех .child элементов на странице (при условии, что querySelectorAll() недоступно). Такая операция достаточно затратна и мы можем трансформировать селектор так:
$('.child', $('.root')[0]); // использование контекста не облегчит поиск
$('.root').find('.child'); // а зачем нам перебор всех элементов внутри .root?
$('.root').children('.child'); // самый правильный вариант
Используем быстрые селекторы для jQuery