В jQuery выбор по классу или идентификатору происходит быстрее, чем по другому атрибуту? - PullRequest
43 голосов
/ 24 июня 2011

В основном, это

$("#someid")

или

$(".someclass")

быстрее, чем

$("[someattr='value']")

Я бы предположил, что это так (то есть выбор по id происходит быстрее, потом по классу, потом по атрибуту), но кто-нибудь знает наверняка?

Ответы [ 6 ]

71 голосов
/ 24 июня 2011

ID абсолютно быстрый.Частично причина в том, что идентификатор должен быть уникальным, поэтому API прекращает поиск после того, как идентификатор найден в DOM.

Если вам нужно использовать селектор класса или атрибута, вы можете повысить производительность, указавнеобязательный параметр контекста.

Например ...

$(".someclass", "#somecontainer")

Где somecontainer - это что-то вроде div, окружающее элемент классом someclass.Это может дать огромный выигрыш в производительности в тех случаях, когда somecontainer составляет небольшую часть DOM.


ОБНОВЛЕНИЕ:

Несколько лет назад я провел несколько тестов вокруг параметра контекста.После прочтения комментариев ниже мне было любопытно, изменилось ли что-нибудь.Действительно, кажется, что сцена изменилась несколько с сегодняшними браузерами.Может быть, это также связано с улучшениями в jQuery?Я не знаю.

Вот мои результаты с 10 000 итераций (код ниже):

IE9

$(".someclass") - 2793 мс

$(".someclass", "#somecontainer") - 1481 мс

Chrome 12

$(".someclass") - 75 мс

$(".someclass", "#somecontainer") - 104 мс

Firefox 3.6

$(".someclass") - 308 мс

$(".someclass", "#somecontainer") - 357 мс

Так что среди этих больших 3 современныхбраузеры, параметр контекста, кажется, только помогает IE9.Старые браузеры также выиграют от использования параметра context.Но, принимая во внимание распространенность каждого из этих браузеров и усредняя все, чистый выигрыш сейчас немного отстает.

А вот код на тот случай, если кто-то захочет попробовать его самостоятельно ...

<html>
    <head>
        <script type="text/javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
        <script type="text/javascript">
            $(document).ready(function(){

                startTime = new Date().getTime();               
                for (i = 0; i < 10000; i++)
                {
                    s = $(".someclass");
                }           
                $("#withoutcontext").html(elapsedMilliseconds(startTime));


                startTime = new Date().getTime();
                for (i = 0; i < 10000; i++)
                {
                    s = $(".someclass", "#somecontainer");
                }           
                $("#withcontext").html(elapsedMilliseconds(startTime));

            });

            function elapsedMilliseconds(startTime)
            {
                var n = new Date();
                var s = n.getTime();
                var diff = s - startTime;
                return diff;
            }
        </script>
    </head>
    <body>
        <h1>jQuery Selector Performance: Context vs No Context</h1>

        <h2>$(".someclass")</h2>
        <span id="withoutcontext">---</span> ms<br /><br />

        <h2>$(".someclass", "#somecontainer")</h2>
        <span id="withcontext">---</span> ms<br /><br />

        <hr />

        <p class="a">a</p>
        <p class="b">b</p>
        <p class="c">c</p>
        <p class="a">a</p>
        <p class="b">b</p>
        <p class="c">c</p>
        <p class="a">a</p>
        <p class="b">b</p>
        <p class="c">c</p>
        <p class="a">a</p>
        <p class="b">b</p>
        <p class="c">c</p>
        <p class="a">a</p>
        <p class="b">b</p>
        <p class="c">c</p>
        <div id="somecontainer">
            <p class="a">a</p>
            <p class="b">b</p>
            <p class="c">c</p>
            <p class="someclass">someclass</p>
        </div>
        <p class="a">a</p>
        <p class="b">b</p>
        <p class="c">c</p>
        <p class="a">a</p>
        <p class="b">b</p>
        <p class="c">c</p>
        <p class="a">a</p>
        <p class="b">b</p>
        <p class="c">c</p>
        <p class="a">a</p>
        <p class="b">b</p>
        <p class="c">c</p>
        <p class="a">a</p>
        <p class="b">b</p>
        <p class="c">c</p>
    </body>
</html>
11 голосов
/ 24 июня 2011

Выбор по ID является самым быстрым, потому что он отображается непосредственно на getElementByID, остальные 2 должны проверить каждый элемент, чтобы определить выбранные элементы.

Если вам необходимо выбрать использование класса или атрибута, попробуйте включить поиск в идентификатор. напр.

$("#someid .someclass")
7 голосов
/ 20 января 2014

ID уникален, и если вы хотите выбрать только один / первый элемент, то здесь эквивалент

$ ("# someid") => 75 695 операций в секунду, самый быстрый

$ (. Unique_class ') => 45 257 операций в секунду, на 40% медленнее: только один класс на странице

$ (". Someclass"). First () => 42 217 операций в секунду, на 46% медленнее: несколько классов на странице, выберите первый элемент

$ (". Someclass: eq (0)") => 18 324 операций в секунду, на 76% медленнее: несколько классов на странице, выберите элемент по выбранному индексу

URL-адрес теста: http://jsperf.com/jquery-selector-speed-tests/98

7 голосов
/ 24 июня 2011

Селекторы идентификаторов и классов, по крайней мере, когда они используются сами по себе, как правило, быстрее, будь то для jQuery или для CSS. Во многом это связано с тем, что браузеры оптимизировали алгоритмы для идентификаторов и классов в своих механизмах DOM / CSS.

В современных браузерах с последними версиями jQuery любые строки селекторов, которые браузер воспринимает как поддерживаемые селекторы CSS, будут обрабатываться document.querySelectorAll(), обеспечивая максимальную производительность при использовании стандартных селекторов CSS. Нестандартные селекторы или старые браузеры заботятся о jQuery и / или библиотеке Sizzle, которые делают все возможное, чтобы использовать методы get-element (ов) DOM для обхода DOM.

Самое важное, что нужно помнить, это то, что производительность будет варьироваться от браузера (версия) к браузеру (версия) из-за различных реализаций DOM. По крайней мере, я так считаю.

2 голосов
/ 24 июня 2011

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

Настоящим кикером здесь является выбор класса внутри, и ID НЕ МОЖЕТ быть быстрее, чем просто выбор класса. Это будет зависеть от страницы и браузера. В моем тестировании выбор сложной страницы с ограниченным числом элементов с «классом», где родительский элемент элемента класса имел идентификатор, такой как:

<div id='iamout'>
  <div class='aonther'>
    <div class='iamin'>stuff</div>
    <div class='iamin'>stuff</div>
  </div>
</div>

селектор, такой как $('.iamin','#iamout'), не всегда был так быстр, как $('.iamin')

Не все браузеры поддерживают выбор по имени класса (изначально), но современные / более новые поддерживают и, следовательно, могут повысить производительность в зависимости от того, какой у вас браузер.

Если вам нужна оптимальная производительность, вам нужно протестировать точную страницу.

0 голосов
/ 24 июня 2011

Id самый быстрый, потому что это единственный элемент, который может иметь этот идентификатор. Многие объекты могут иметь одинаковое имя класса. Кто-то может проверить это, но может показаться, что документ не нуждается в дальнейшем просмотре после того, как идентификатор будет найден. Для классов это может быть не так ?? НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...