2010-01-29 2 views
2

У меня есть следующий HTML:JQuery: производительность селектор

... 
<div id="panel"> 
    <div class="abc"> 
     <p class="xyz">Hello</p> 
    </div> 
</div> 
... 

Вопрос: Какой самый быстрый способ с JQuery для меня, чтобы получить доступ к p.xyz элемент? I've read some performance reviews, но они не учитывают все разные сценарии.

Я мог бы сделать следующее, но не знаю, как проверить, что является самым быстрым.

$('.xyz'); 
$('p.xyz'); 
$('#panel .xyz'); 
$('#panel p.xyz'); 
$(".xyz", $('#panel')); 

Я уверен, что есть еще больше способов доступа к этому узлу.

>>>Какой самый быстрый и рекомендуемый способ?

ответ

1

Самый быстрый селектор всегда является идентификатором или селектором, который спускается с него. В вашем случае:

$('#panel .xyz'); and $('#panel p.xyz'); 

будет примерно одинаковой скоростью, так близко, это не имеет значения ... но те не-ID, на несколько порядков меньше, чем в производительности.

Существует также уже здоровая доза ответов на этом in another question on SO.

+0

Я читал когда-то, что, «Если я не ошибаюсь, JQuery также снизу вверх двигатель Это означает, что $ („# Foo бар ДИВ“) намного меньше, чем $ («bar div #foo»). Например, $ ('# foo a') будет проходить через все элементы на странице и посмотреть, есть ли у них предок #foo, что делает этот селектор очень неэффективен ». http://stackoverflow.com/questions/46214/good-ways-to-improve-jquery-selector-performance/2062027#2062027 – Allen

+0

Итак, вы уверены, что $ ('# panel p.xyz') будет быстрее, чем просто $ ('p.xyz')? – Allen

+2

Это правда в некоторой степени ... однако, в случае JQuery Sizzle это знает, и сразу же идет ярлык к ID. Если у вас несколько элементов с одинаковым идентификатором, это будет непредсказуемо, но это все равно недействительным HTML, так вот как работает sizzle ... как и должно быть. –

1

«... но не знаю, как проверить, какой из является самым быстрым».

Посмотрите на firebug. В частности, профайлер Javascript. В основном:

  • Установите плагин firebug Firefox.
  • Щелкните правой кнопкой мыши по иконке маленькой ошибки на внизу справа от firefox. Выберите «включить все панели».
  • Нажмите на вкладку «консоль».
  • Нажмите на ссылку «Профиль». Наведите указатель мыши на него: «Время выполнения Javascript». Остальное должно быть достаточно интуитивным. Если вы обнаружите, что это не так, есть много tutorials, чтобы помочь вам.

Теперь вы можете экспериментировать с различными селекторы/DOM структуры и измеряют их относительные времена выполнения для лучшего понимания которых селекторы на самом деле ощутимо влияние на производительность вашего веб-приложения.

Надеюсь, что это поможет.

5

Каждый раз, когда вы можете использовать селектор ID, он будет быстрее. Механизм селектора jQuery (Sizzle) читается справа налево. Единственное исключение - если в крайнем левом углу находится id, то для охвата поиска используется id.

Кроме того, поскольку jQuery использует встроенные функции браузера, где это возможно, всегда указывать имя тега при использовании селектора классов.

В вашей серии вариантов, как на «что быстрее», это будет выполнять быстрый:

$('#panel p.xyz'); 

Потому что это сфера поиска к одному элементу, а затем найти p теги, а затем выпадают выбора всех тех, у кого нет соответствующего класса.

В некоторых браузерах, с большим количеством других родственный p тегов, не должен соответствовать запрос, он будет выполнять намного быстрее, чем:

$('#panel .xyz'); 

Просто помните, что JQuery использует столько нативные функции насколько это возможно. Каждый основной браузер имеет getElementById, поэтому, если это возможно, используйте id.

Далее, у каждого браузера есть getElementsByTagName. У некоторых браузеров нет getElementsByClassName. Таким образом, помощь jQuery поможет вам с помощью id, где возможно охватить поиск, а также путем сопоставления имен тегов с классом для поиска класса.

Никогда не передавайте объект JQuery в параметре Область

Одна вещь, вы должны НИКОГДА не сделать, это ваш последний пример:

$(".xyz", $('#panel')); 

Это не будет иметь никакого влияния скорости (и в цикл будет медленнее), чем с использованием обычной строки. Только каждый передает элемент DOM в этот параметр. Это может быть очень полезно, если у вас есть элемент DOM уже:.

$("#panel").click(function(){ 
    var p = $("p.xyz", this); // This is fast 
});