JQuery не селектор не работает с классом - PullRequest
1 голос
/ 24 февраля 2012

Хорошо, еще один тупой вопрос JQuery ...

Селектор not в jQuery вызывает у меня проблемы. Я пытаюсь выбрать все, кроме первого элемента, имеющего данный класс toggle-button. Но у меня может быть этот диалог с консолью ...

? $('.toggle-button').length
4
? $('.toggle-button:not(:eq(0))').length
4

Без разницы. Но ...

? $('div').length
23
? $('div:not(:eq(0))').length
22

Что дает, Ресиг?

Почему селектор not имеет другое поведение при применении к классу (по-видимому) - и как я могу сделать желаемый выбор наиболее идиоматичным способом jQuery?

:not(:first) делает то же самое ...

UPDATE

Спасибо за все ответы. Это похоже на ошибку в партнерстве jQuery / IE.

Решения ...

$('.toggle-button').filter(':gt(0)')

$('.toggle-button').not(':first')

$('.toggle-button').slice(0);

... и, несомненно, еще много. Я оставлю это безумным, чтобы понять, что лучше: D

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Любая не CSS-фильтрация / выбор должны выполняться с помощью методов jQuery, так как это означает, что jQuery не может использовать CSS для ускорения селектора. Он пытается использовать встроенную поддержку CSS в браузере, но если вы используете :not или :eq и т. Д., Он должен использовать собственную систему синтаксического анализа, которая работает медленнее.

Воздушный кавычек "правильный" способ таков:

$('.toggle-button').filter(':gt(0)').length;

Относительно того, почему :not ведет себя по-другому, я не уверен. Я продолжу думать, и если я получу лампочку, я обновлю этот ответ:)


Редактировать: похоже, это какая-то специфическая для браузера особенность - я только что сделал

  • $('.prettyprint').length - 3
  • $('.prettyprint:not(:eq(0))').length - 2
  • $('.question-header').length - 1
  • $('.question-header:not(:eq(0))').length - 0

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


Редактировать Редактировать: Это ошибка IE8, предположительно связанная с механизмом выбора CSS, который он использует. См. http://jsfiddle.net/5gSxP/2/ для краткого изложения трех методов выбора, первый сбой в IE8, но тот, что в этом ответе, работает нормально.

1 голос
/ 24 февраля 2012

Вы можете заставить его работать и более читабельным с .not():

$('div').not(':first').length;
...