2010-04-08 6 views
3

Я хочу выделить все дочерние элементы элемента body перед элементом с идентификатором foo (который является дочерним по дате body). Так как это не выглядит как есть :before() или :after() селекторы, я получил это работает так:Есть ли более сексуальный способ написать этот селектор jQuery?

$('body > :first').nextUntil('#foo').andSelf(); 

но мне кажется запутано. Может ли это быть сделано с меньшим количеством вызовов функций или более эффективно? Может быть, что-то похожее на $('body > *:before(#foo)')?

+0

На самом деле есть селектор с названием Next Siblings Selector '$ ('# foo ~ *')' Однако я не вижу раньше. Может быть, лучше использовать nextUntil, потому что * имеет тенденцию быть проблемой производительности. – Powerlord

+0

Так что, возможно, я мог бы получить то, что хочу, отрицая это. Может быть, более элегантный, возможно, медленный. –

+0

'$ ('body> *: not (#foo, #foo ~ *)');' занимает примерно 750 раз дольше, чем '$ ('body'). Children(). First(). NextUntil ('# foo «) .andSelf()'. –

ответ

4

Это не то, что kludgy. Infact, используя ваш пример с «*» в селекторе, является WAY медленнее, чем функции вызова.

Итак, я предложил бы использовать одну функцию более оригинальный выбор:

$('body').children().first().nextUntil('#foo').andSelf() 

большинство из этих функций использует простой срез массива, чтобы уменьшить набор, где selecters должен пройти через DOM.

+1

'first()' возвращает первый элемент совпадающего набора (например, используя '$ ($ ('body') [0])'), а не первый ребенок. –

+0

... так что это должно быть '$ ('body'). Children(). First(). NextUntil ('# foo'). AndSelf()' –

+0

* Any * selector с использованием нестандартного jQuery- только селектора будут медленными по сравнению со стандартными CSS-селекторами, такими как 'body'. Это связано с тем, что стандартные селектора могут быть переданы быстрому собственному методу 'querySelectorAll' в современных браузерах. Всегда используйте версию метода (например, 'first()'), предпочитая селекторную версию, если у вас действительно нет другого выбора. – bobince

Смежные вопросы