Какие селектора CSS3 действительно поддерживают jQuery, например: nth-last-child ()?

Согласно http://api.jquery.com/category/selectors/, мы можем использовать большое количество селекторов CSS в jQuery, но, например, :nth-last-child() здесь не упоминается. Однако, когда я тестирую следующее (с jQuery 1.7.1 от Google), он фактически работает на Firefox, Chrome и IE 9, но не на IE 9 в режиме эмуляции IE 8:

 $('li:nth-last-child(2)').css('color', 'red'); 

Так что происходит? Похоже, что jQuery сгенерировал CSS-код, например li:nth-last-child(2) { color: red } и каким-то образом его ввел, который затем работает ОК в браузерах, поддерживающих используемый селектор. Но это было бы странно.

Самое главное, есть ли какой-то трюк, чтобы заставить jQuery поддерживать такие селектора во всех браузерах?

Хотя jQuery рекламирует соответствие стандарту 3 уровня выбора на своей домашней странице , он не полностью реализует спецификацию. В своей собственной документации Selectors он поясняет, что он «[занимает] из CSS 1-3, а затем [добавляет] свои собственные« селектора ». 1

Начиная с jQuery 1.9, практически все селекторы стандарта уровня 3 поддерживаются Sizzle (его основной селекторной библиотекой) со следующими исключениями:

  • jQuery не может выбирать псевдоэлементы, поскольку они являются абстракциями на основе CSS дерева документов, которые не могут быть выражены через DOM .

  • jQuery не может разрешать динамические псевдоclassы, такие как :link / :visited для гиперссылок и :hover :active и :focus для взаимодействия с пользователем. Последний набор псевдоclassов, в частности, основан на состоянии, а не на событиях, поэтому вам нужно использовать обработчики событий, а не псевдоclassы для запуска кода, когда элементы входят и покидают эти состояния. См. Этот ответ для объяснения.

  • jQuery также не может разрешить префиксы пространства имен, поскольку он не поддерживает размещение имен в CSS .

Следующие селектора уровня 3 реализованы в jQuery 1.9 и новее , но не jQuery 1.8 или старше 2 :

  • :target
  • :root
  • :nth-last-child()
  • :nth-of-type()
  • :nth-last-of-type()
  • :first-of-type
  • :last-of-type
  • :only-of-type

Дополнительно:

  • :lang() , введенное в CSS2, также отсутствует.

Причина, по которой ваш селектор работает в Firefox, Chrome и IE9, состоит в том, что jQuery сначала передает строку выбора в исходную реализацию document.querySelectorAll() прежде чем вернуться к Sizzle. Так как это допустимый селектор CSS, document.querySelectorAll() успешно вернет список узлов для использования jQuery, тем самым устраняя использование Sizzle.

В случае неудачи document.querySelectorAll() , jQuery автоматически возвращается к Sizzle. Существует ряд сценариев, которые могут привести к сбою:

  • Селектор недействителен, не поддерживается или иным образом не может использоваться (подробности см. В спецификации API Selectors ).

  • Сам метод document.querySelectorAll() не поддерживается (jQuery фактически проверяет это с помощью простого оператора if, поэтому он не терпит неудачу в этом смысле этого слова, но вы получаете изображение).

В вашем случае, хотя IE9 и IE8 реализуют document.querySelectorAll() , IE8 не поддерживает :nth-last-child() . Поскольку jQuery / Sizzle не реализует :nth-last-child() либо, нет никакого резервного поведения для использования, что приводит к полному сбою в IE8.

Если вы не можете обновить jQuery до 1,9 даже, по крайней мере, (ветвь с поддержкой обратной совместимости), вы всегда можете использовать пользовательские расширения селектора, чтобы самостоятельно реализовать отсутствующие псевдоclassы. Однако, поскольку jQuery 1.9 добавляет поддержку вышеперечисленных селекторов при сохранении совместимости со старыми версиями IE, лучше всего обновить эту версию как минимум, если вам нужна совместимость.


1 Он поддерживает :contains() , последний определенный в этой старой ревизии CR спецификации перед тем, как быть опущен позже, а также расширение :not() из стандарта. Различия между реализацией jQuery и текущим стандартом рассматриваются в этом вопросе .

2 Несколько других селекторов (например, комбинаторы + и ~ sibling :empty :lang() и некоторые селектора атрибутов CSS2) также должны были быть удалены и во время ранней разработки jQuery, просто потому, что Джон Ресиг не думал, что кто-нибудь будет использовать их . Почти все из них вошли в финальный релиз после того, как было сделано еще несколько тестов. :lang() был единственным, кто никогда не делал этого в релизе до 1.9, как указано выше.

  • Селектор данных jquery
  • Как я могу выбрать элемент с несколькими classами в jQuery?
  • Эффективный, лаконичный способ найти следующий соответствующий друг?
  • jQuery: исключить $ (this) из селектора
  • Фильтр jquery имеет +
  • Как я могу получить идентификатор элемента с помощью jQuery?
  • jQuery выбрать все, кроме первого
  • jQuery: содержит селектор для поиска нескольких строк
  • addID в jQuery?
  • jQuery ИЛИ Селектор?
  • Почему мой jQuery: not () не работает в CSS?
  • Interesting Posts

    Как я могу контролировать использование Интернета в своей сети?

    Почему #include не требуется использовать printf ()?

    Что делать с поврежденной SD-картой: переформатировать ее или уничтожить?

    Процесс не может получить доступ к файлу, поскольку он используется другим процессом

    Получить реферер после установки приложения из Android Маркета

    Вертикальная панель задач на сервере Windows 2008 слишком широкая

    Memory Stick, похоже, быстро ухудшилась после установки

    Есть ли способ перебрать структуру с элементами разных типов в C?

    Синтаксис и использование примера _Generic в C11

    Как изменить стиль анимации модального UIViewController?

    Delphi 2010: как сохранить целую запись в файл?

    org.hibernate.HibernateException: /hibernate.cfg.xml не найден

    Не удалось решить: com.google.firebase: firebase-core: 9.0.0

    Двойной монитор (IGP с графическим процессором) в Linux

    E / Поверхность: getSlotFromBufferLocked: неизвестный буфер: 0xab7519c0

    Давайте будем гением компьютера.