Реализация родительского селектора в CSS с помощью jQuery, который автоматически применяется к новым элементам в DOM

CSS не поддерживает родительские селекторы, например «выбрать все <p>, содержащие <img>».

Одним из предлагаемых решений здесь является использование jQuery, например:

$('#parent:has(#child)').addClass('my-special-class');

Однако у меня есть <div>, который периодически обновляется новым контентом, и мне нужно повторно применять my-special-class к новым элементам, которые соответствуют селектору '#parent:has(#child)' внутри этого <div>.

Как можно было это сделать?

Я разрабатываю сторонний плагин, поэтому у меня нет особого контроля над его стилем, событиями и т. д.

Почему бы не использовать класс css для родительского элемента, у которого есть прямые дочерние элементы, к вашему желаемому родителю, содержащему img? Я имею в виду .wrapper> .parentIMG

Juorder Gonzalez 25.05.2018 06:54

Это не проблема с родительским селектором, а из-за того, что выбор jQuery не работает в целом. То есть вы столкнетесь с этой проблемой независимо от того, какой селектор вы используете.

BoltClock 25.05.2018 06:57

@JohuderGonzalez Я не понимаю, как это можно сделать. Допустим, у вас есть два элемента <p>: div > p > img и div > p > span. Как вы стилизуете первый p, но не второй p?

user6269864 25.05.2018 07:06
Поведение ключевого слова "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
443
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Одно из решений - привязать событие DOMSubtreeModified к контейнеру div и добавить внутрь свой код.

$('.container').on("DOMSubtreeModified",function(){
    $('.parent:has(.child)').addClass('special-child');
});

// find elements
var parent = $("#parent")
var button = $("button")

// handle click and add class
button.on("click", function() {
  const el = '<div class = "parent"><p class = "child">Hello World</p></div>';
  parent.after(el);
})

$(function() {
  $('.parent:has(.child)').addClass('special-child');

  $('.continer').on("DOMSubtreeModified", function() {
    $('.parent:has(.child)').addClass('special-child');
  });

})
body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

.child {
  background: #fff;
  border-radius: 4px;
  padding: 10px;
  font-size: 25px;
  text-align: center;
  transition: all 0.2s;
  margin: 4px auto;
  width: 300px;
}

button {
  background: #0084ff;
  border: none;
  border-radius: 5px;
  padding: 8px 14px;
  font-size: 15px;
  color: #fff;
}

.special-child {
  color: red;
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<div class = "continer">
  <div class = "parent" id = "parent">
    <p class = "child">Hello World</p>
  </div>
</div>
<button>Add Child</button>
DOMSubtreeModified устарел в пользу API-интерфейса Mutation Observer. developer.mozilla.org/en-US/docs/Web/Events/DOMSubtreeModifi‌ ed
Jacob Goh 25.05.2018 07:21

Использование DOMSubtreeModified приводит к бесконечному циклу в Internet Explorer после второго вызова. Другие браузеры работают нормально.

user6269864 25.05.2018 12:22

Если вы добавите следующий jquery и только один класс, он будет работать как :visited:

$("div.my-div").click(function(){
    $(this).addClass("visited");
});

И просто добавьте в css один класс:

.visited:hover{
  outline: 2px solid orange;
}

Если вы добавите этот код к своему текущему, вы получите те же функции, что и для :visited.

Вот рабочий пример, которую я пробовал на вашем коде:

https://jsfiddle.net/thisisdg/27srmuy6/

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