Два очень похожих метода библиотеки jQuery, служащих для фильтрации выборки - метод .has() и метод .hasClass().
И действительно, оба этих метода похожи между собой. Чтобы было понятно, лучше сразу перейду к примерам.
Метод .has()
Метод .has() фильтрует элементы, имеющие в своем составе указанные в .has() селекторы.
Простой пример:
$('li').has('a').addClass('active');То есть: всем элементам li, имеющим в качестве потомков (в своем составе) элемент a, присвоить класс .active.
На лицо, как бы это сказать, обратная фильтрация - справа налево. Обычно все методы библиотеки jQuery работают слева направо.
Этот метод чем-то похож на метод .parent(). В качестве примера рассмотрим такой вариант:
$('a').parent('li').addClass('active');… что читается таким образом: всем элементам li, являющимся родителями элементов a, присвоить класс .active.
Напомню, что метод .has() работает именно с селекторами и имеет такой синтаксис:
.has('selector')Метод .hasClass()
Метод .hasClass() очень похож по принципу действия на предыдущий метод has() - но это только кажущееся впечатление.
Во-первых, как понятно из имени метода .hasClass(), что он работает с классами, а не селекторами.
То есть, синтаксис метода .hasClass() таков:
.hasClass('class')Во-вторых, метод .hasClass() возвращает логическое true или false, в отличие от метода .has(), который возвращает массив объектов, доступных для дальнейшей обработки.
Простой пример:
if ($('li').hasClass('active')) {
$('li').find('a').addClass('activeLink');
} else {
$('li').find('a').addClass('inactiveLink');
}… что читается таким образом: если элементы li имеют класс .active, то всем элементам a, являющимся потомками элементов li, присвоить класс .activeLink; иначе всем элементам a присвоить класс .inactiveLink.
Стоит обратить внимание, что в случае метода .hasClass() имеет место быть обычный способ фильтрации элементов - слева направо; выборка сужается по мере появления новых условий.
Вот такая картина получается, с двумя этими методами - .has() и .hasClass.
На этом все.