Получить все элементы, которые содержат определенного потомка

Я пытаюсь перебрать все теги <li>, содержащие класс .fas, с помощью метода jQuery contains () и выполнить некоторые действия для каждого из них.

$('li:contains(".fas")').each(function (index) {
    //stuff
}

Я продолжаю получать справочную ошибку, которая содержит не определено. Я неправильно использую этот метод?

Разве это не пройдет через все .fas, у которых есть родительский элемент <li>? Я пытаюсь получить сами <li> ''

noclist 18.10.2018 18:09

Ваш вопрос немного неоднозначен, но приведенный выше запрос возвращает все li, которые имеют класс fas. Это то, что вы ищете?

Andrei Cioara 18.10.2018 18:10

Нет, я пытаюсь получить все li, у которых есть наследник с классом .fas.

noclist 18.10.2018 18:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
71
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вам нужен has().

$('li:has(".fas")').each(function (index) {
    //stuff
}

https://api.jquery.com/has/

Для справки: contains() проверяет, является ли «элемент DOM потомком другого элемента DOM»; :contains() выбирает «все элементы, содержащие указанный текст»; has() сокращает «набор совпадающих элементов до тех, у которых есть потомок, соответствующий селектору или элементу DOM».

showdev 18.10.2018 18:22

Неопределенность вашего вопроса заставляет меня ответить на этот вопрос.

Прежде всего:

$('li.fas') 

Это говорит движку sizzle: получите все элементы, которые имеют класс fas, затем уменьшите это до элементов li (которые имеют этот класс)

С пробелом между ними говорится:

$('li .fas')

Получите все элементы, которые имеют класс fas, затем уменьшите до тех, которые являются наследниками элемента li.

$('li>.fas')

Получите все элементы, которые имеют класс fas, затем уменьшите их, сделайте набор, который является прямыми дочерними элементами элемента li.

Другой ответ - это .has(), поэтому я не буду повторять это.

Фильтр: (в основном то же, что и: has () в этом случае

$('li').filter(function(){
    // reduce the li set; return true when a descendant has the 'fas' class
    return !!$(this).find('.fas').length;
});

Подробнее о контексте здесь: https://stackoverflow.com/a/16423239/125981

Ни один из этих вариантов не работает для li, которые содержат потомков с классом .fas.

noclist 18.10.2018 18:24

@noclist Примечание Я добавил фильтр - из-за неоднозначности вопроса

Mark Schultheiss 18.10.2018 18:28

Другой способ сделать это - перевернуть вашу логику.

$('.fas').closest('li');

Вы можете найти все фас, а затем найти их родительские списки.

Это будет запускать функцию для каждого случая, когда .fas является дочерним по отношению к li, что может привести к повторному выполнению. где у элемента списка есть несколько таких дочерних элементов.

isherwood 18.10.2018 18:24

Это верное заявление

Taplar 18.10.2018 18:25

Другие вопросы по теме