Подтвердить что ты не робот

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

В соответствии с 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 поддерживать такие селектора во всех браузерах?

4b9b3361

Ответ 1

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

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

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

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

  • :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, как указано выше.