Я хотел написать свой ответ только для обсуждения двух предыдущих ответов: the answer от gdoron и the answer от neu-rah. Если бы мы увидели на счету голосования, можно увидеть, что большинство читателей лучше находят ответ Дорона. Я не согласен, и я пытаюсь объяснить, почему.
Объяснение вы найдете документацию :gt()
Selector (см «Дополнительные примечания:» here):
Поскольку :gt()
является расширение JQuery и не является частью спецификации CSS , запросы с использованием :gt()
не может принять преимущество повышения производительности , обеспечиваемого собственным DOM querySelectorAll()
. Для лучшей производительности в современных браузерах вместо этого используйте $("your-pure-css-selector").slice(index)
.
Вы можете проверить код с here или лучше here (с не-минимизированы кода JQuery 1.7.2). В коде используется только оператор $("ul li:gt(6)").css("color", "red");
. Лучше понять проблему, если вы запустите демонстрационную версию в «Инструментах разработчика Chrome» с активированной кнопкой «Пауза на исключениях». Вы увидите следующее исключение (это будет не первый):
Таким образом, вы можете видеть, что текущая реализация JQuery попытаться использовать роднойquerySelectorAll()
веб-браузер, чтобы получить лучшие представление. После этого функция $.makeArray будет использоваться для создания обертки jQuery из NodeList
. В случае исключения the line
return oldSizzle(query, context, extra, seed);
Таким образом, вы будете иметь лучшую производительность, если вы будете использовать селекторы поддерживаемые querySelectorAll()
. Например
$("ul li").slice(7)
лучше, как
$("ul li:gt(6)")
Я бы вы рекомендовали использовать более точные селекторы всякий раз, когда это возможно. Например, если элемент родительского <ul>
имеет id="menu1"
, то вы можете использовать
$("#menu1 >li").slice(7)
для достижения наилучших результатов. Это поможет дополнительно в случае нескольких<ul>
элементов на вашей странице.
Кто-то может упомянуть: селектор "ul li:gt(6)"
работает достаточно быстро. Это правильно, но вы должны не забывать, что вы используете иногда селектор внутри цикла или используете его внутри функций, которые будут вызываться внутри петель. Таким образом, разница между 10 мс и 30 мс может быть намного более очевидной, если время выполнения будет умножено на 100.
Кроме того, кто-то задает себе вопрос, как реализовать выбор и получить ответ, он/она будет использовать код рисунок постоянно. Я думаю, что было бы лучше использовать шаблон, который имеет преимущество в производительности. Не так.
ОБНОВЛЕНО: Чтобы очистить разницу в производительности $("ul li:gt(6)")
, $("ul li").slice(7)
и $("#menu1 >li").slice(7)
селекторов я сделал дополнительно the demo. Каждый может проверить разницу в веб-браузере, который он использует. Вы должны дополнительно не забывать, что в случае страницы с многие другие элементы, селектор id будет работать лучше.
На моем компьютере время выполнения $("ul li").slice(7)
и $("#menu1 >li").slice(7)
примерно одинаковы (страницы имеют очень маленькие элементы) и примерно 2,5-4,5 раз лучше как для $("ul li:gt(6)")
. Результаты могут зависеть от количества элементов li
, количества элементов на странице и многих других вещей, но я надеюсь, что тест ясно показал, что использование slice
имеет преимущество в производительности по сравнению с использованием :gt
(точно так же, как мы может читаться в документации jqGrid, о которой упоминалось ранее).
На самом деле, ваш предыдущий ': gt (6)' был прав ... он начинается с 7-го индекса, который совпадает с началом 8-го ребенка (больше, чем 7-й ребенок). – BoltClock
@BoltClock. Правда, не знаю, почему я его изменил, 6 в его примере смутили меня. – gdoron
Не беспокойтесь, это всегда происходит :) – BoltClock