Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   :nth-of-type не правильно обрабатывает классы (https://javascript.ru/forum/jquery/47562-nth-type-ne-pravilno-obrabatyvaet-klassy.html)

Aetae 29.05.2014 12:39

http://jsperf.com/jquery-eq-method-v...udo-selector/6
WorM32, он правильный с точки зрения логики и абстракции. То что он работает медленнее - вопрос реализации в jquery.

Sweet 29.05.2014 12:47

Цитата:

Сообщение от Aetae
он правильный с точки зрения логики и абстракции

Почему? Одинаково же, не?

Aetae 29.05.2014 12:54

Sweet,
Нет. Если смотреть абстрактно:
$("div.b").eq(1) - взять все элементы с классом "div.b", вернуть второй из них.
$("div.b:eq(1)") - взять элемент имеющий класс "div.b" и идущий вторым.

Соответственно второе должно выполнятся как минимум не медленнее первого.
Почему же реальность так несовершенна - вопрос к авторам jq.)

WorM32 29.05.2014 13:58

Цитата:

Сообщение от Aetae (Сообщение 313952)
Sweet,
Нет. Если смотреть абстрактно:
$("div.b").eq(1) - взять все элементы с классом "div.b", вернуть второй из них.
$("div.b:eq(1)") - взять элемент имеющий класс "div.b" и идущий вторым.

Соответственно второе должно выполнятся как минимум не медленнее первого.
Почему же реальность так несовершенна - вопрос к авторам jq.)

С точки зрения jQuery ваши определения равнозначны, тк второй вариант это сахар для первого (и забегая вперед, он не может быть ни при каких условиях быть быстрее первого именно по этой причине)

Цитата:

Because :eq() is a jQuery extension and not part of the CSS specification, queries using :eq() cannot take advantage of the performance boost provided by the native DOM querySelectorAll() method. For better performance in modern browsers, use $("your-pure-css-selector").eq(index) instead.
http://api.jquery.com/eq-selector/

А вот с точки зрения браузера, если бы это был нативный селектор, ваше определение в корне неправильное.
Определение в таком случае должно было быть такое: "Выбрать все элементы идущие вторыми. Из этих элементов выбрать с классом b и тегом div".

Aetae 29.05.2014 14:36

Мде. А ничего что мы работаем с абстракциями? Внутренняя кухня должна оптимизироваться и подстраиваться под логику человека, а никак не наоборот. Выбор одного элемента должен быть быстрее выбора всех. Как это достигается - меня не волнует.

Sweet 29.05.2014 15:05

Цитата:

Сообщение от WorM32
второй вариант это сахар для первого

В чём сахар-то? Вообще же одно и тоже: одинаковое количество символов и разница только в одном символе (:eq вместо .eq).
Цитата:

Сообщение от Aetae
Если смотреть абстрактно

Причём тут абстракция и "смотреть абстрактно". Абстакция подразумевает абстрагироваться от реализации, не? А оба варианта имеют захардкоженную структуру DOM.
Посоны, вы просто холиварите. Это одно и тоже:
$("div.b").eq(1)
$("div.b:eq(1)")
$("div.b").find(":eq(1)")
$(":eq(1)", "div.b")

рони 29.05.2014 15:15

:-?
<!DOCTYPE HTML>

<html>

<head>
    <title>Untitled</title>
</head>

<body>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
    <ul>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
    <script>
        var time1 = new Date()
         for (var i = 0; i < 1000; i++) {
            $("div.b:eq(1)").html()
        }
        time1 = ((new Date()).getTime() - time1.getTime());
        var time2 = new Date()
         for (var i = 0; i < 1000; i++) {
            $('div.b').eq(1).html()
        }
        time2 = ((new Date()).getTime() - time2.getTime());
        var time3 = new Date()
         for (var i = 0; i < 1000; i++) {
            $("div.b").find(":eq(1)").html()
        }
        time3 = ((new Date()).getTime() - time3.getTime());
        var time4 = new Date()
         for (var i = 0; i < 1000; i++) {
            $(":eq(1)", "div.b").html()
        }
        time4 = ((new Date()).getTime() - time4.getTime());
        alert([time1, time2, time3, time4])
    </script>
</body>

</html>


Часовой пояс GMT +3, время: 01:48.