Ответ 1
Пока jQuery рекламирует соответствие Селектора уровня 3 на своем домашняя страница, он не полностью реализует спецификацию. В своей собственной документации Selectors она разъясняет, что она "[занимает] из CSS 1-3, а затем [добавляет] свою собственную" селекторы. 1
Начиная с jQuery 1.9, практически все селекторы стандарта уровня 3 поддерживаются Sizzle (его базовая селекторная библиотека), с следующие исключения:
-
jQuery не может выбрать псевдоэлементы как они являются абстракциями на основе CSS дерева документов, которые не могут быть выражены через DOM.
-
jQuery не может разрешать динамические псевдоклассы, такие как
:link
/:visited
для гиперссылок и:hover
,:active
и:focus
для взаимодействия с пользователем. Последний набор псевдоклассов, в частности, основан на состоянии, а не на событиях, поэтому вам нужно использовать обработчики событий, а не псевдоклассы для запуска кода, когда элементы входят и покидают эти состояния. См. этот ответ для объяснения. -
jQuery также не может разрешить префиксы пространства имен, поскольку он не поддерживает namespacing в 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()
успешно вернет список node для использования jQuery, тем самым устраняя использование Sizzle.
В случае неудачи document.querySelectorAll()
jQuery автоматически возвращается к Sizzle. Существует несколько сценариев, которые могут привести к сбою:
-
Селектор недействителен, не поддерживается или иным образом не может быть использован (подробнее см. Спецификация API-переключателей).
-
Сам метод
document.querySelectorAll()
не поддерживается (jQuery действительно проверяет это с помощью простого оператора if, поэтому он не терпит неудачу в этом смысле этого слова, но вы получаете изображение).
В вашем случае, хотя IE9 и IE8 реализуют document.querySelectorAll()
, IE8 не поддерживает :nth-last-child()
. Поскольку jQuery/Sizzle не реализует :nth-last-child()
, нет никакого резервного поведения, которое приводит к полному сбою в IE8.
Если вы не можете обновить jQuery до 1,9 даже, по крайней мере, (ветвь с поддержкой обратной совместимости), вы всегда можете использовать пользовательские расширения селектора, чтобы самостоятельно реализовать отсутствующие псевдоклассы. Однако, поскольку jQuery 1.9 добавляет поддержку вышеперечисленных селекторов при сохранении совместимости со старыми версиями IE, лучше всего обновить эту версию как минимум, если вам нужна совместимость.
1 Он поддерживает :contains()
, последний определенный в эта старая версия CR спецификации spec перед тем, как быть отброшенным позже, а также расширить :not()
от стандарта. Различия между реализацией jQuery и текущим стандартом рассматриваются в этом вопросе.
2 Несколько других селекторов (например, комбинаторы +
и ~
, :empty
, :lang()
и некоторые селектора атрибутов CSS2) должны были быть отброшены как хорошо во время раннего развития jQuery, только потому, что Джон Ресиг не думал, что кто-то их будет использовать, Почти все из них вошли в финальный релиз после того, как было сделано еще несколько тестов. :lang()
был единственным, кто никогда не попадал в какой-либо выпуск до 1.9, как указано выше.