: nth-of-type () в jQuery / Sizzle?

Меня удивило то, что Sizzle (использует механизм выбора jQuery) имеет встроенный селектор :nth-child() , но не имеет селектора :nth-of-type() .

Чтобы проиллюстрировать разницу между :nth-child() и :nth-of-type() и проиллюстрировать проблему, рассмотрите следующий HTML-документ :

     :nth-of-type() in Sizzle/jQuery?  body p:nth-of-type(2n) { background: red; }    

The following CSS is applied to this document:

body p:nth-of-type(2n) { background: red; }

This is paragraph #1.

This is paragraph #2. (Should be matched.)

This is paragraph #3.

This is paragraph #4. (Should be matched.)

This is not a paragraph, but a div.

This is paragraph #5.

This is paragraph #6. (Should be matched.)

$(function() { // The following should give every second paragraph (those that had red backgrounds already after the CSS was applied) an orange background. // $('body p:nth-of-type(2n)').css('background', 'orange'); });

Поскольку Sizzle использует встроенные в браузер методы querySelector() и querySelectorAll() если они присутствуют (т. Е. В браузерах, которые уже реализуют API Selectors ), такие вещи, как $('body p:nth-child'); конечно, будет работать. Однако он не будет работать в старых браузерах, потому что Sizzle не имеет метода возврата для этого селектора.

Можно ли легко добавить селектор :nth-of-type() в Sizzle или реализовать его в jQuery (возможно, с помощью встроенного селектора :nth-child() )? Пользовательский селектор с параметрами будет приятным.

 /** * Return true to include current element * Return false to exclude current element */ $.expr[':']['nth-of-type'] = function(elem, i, match) { if (match[3].indexOf("n") === -1) return i + 1 == match[3]; var parts = match[3].split("+"); return (i + 1 - (parts[1] || 0)) % parseInt(parts[0], 10) === 0; }; 

Тестовый пример – ( проверьте IE или переименуйте селектор )

Вы можете, конечно, добавить еще и странно :

 match[3] = match[3] == "even" ? "2n" : match[3] == "odd" ? "2n+1" : match[3]; 

плагин jQuery moreSelectors поддерживает nth-of-type (и многие другие селектора). Я предлагаю либо использовать это, либо просто реализовать простой плагин, который реализует только точные селектор, который вам нужен. Вы должны иметь возможность копировать-вставить код оттуда.

Счастливый взлом!

Я не могу притворяться, что знаю, как реализуется nth-of-type, но jQuery действительно обеспечивает механизм, с помощью которого вы можете создать свой собственный пользовательский селектор.

Следующий вопрос касается пользовательских селекторов и может дать вам полезную информацию

Какие полезные пользовательские селектора jQuery вы написали?

  • Найти все элементы на основе ids с помощью regex в селекторе jQuery
  • Каков самый быстрый способ выбора элементов-потомков в jQuery?
  • jQuery выбрать все, кроме первого
  • полный календарный выбор ячейки на мобильном устройстве?
  • Получить список отмеченных флажков в div с помощью jQuery
  • jQuery .bind () vs. .on ()
  • Как выбрать элементы, которые не имеют определенного дочернего элемента с JQuery
  • Случай селектора CSS для атрибутов
  • jQuery ИЛИ Селектор?
  • jQuery как найти элемент на основе значения атрибута данных?
  • jQuery выбрать по classу VS выбрать по атрибуту
  • Interesting Posts

    Неужели SSD-диски не так долго работают с Windows XP, как с другими ОС?

    TortoiseSVN – Иконки не отображаются

    Сравните значения двух массивов – classического asp

    Какой графический API следует использовать с Azure AD B2C

    Добавить панель инструментов в нижней части заголовка с помощью jqgrid

    Два экземпляра Windows Vista при загрузке после неудачной очистки

    Как заставить Windows 7 создать новый профиль домена с тем же именем, что и существующий?

    Угловой 2 Используйте компонент из другого модуля

    построение графических диаграмм на карте в ggplot

    Как запустить хранимые процедуры в Entity Framework Core?

    Удаление повторяющихся комбинаций (независимо от порядка)

    Что такое закрытый список фигурных скобок, если не список intializer_list?

    Android: SkImageDecoder :: Factory возвращен null

    Есть ли способ скрыть ярлыки панели задач и не комбинировать кнопки панели задач?

    Может ли ng-контент использоваться внутри ngFor?

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