@JustFeeLin
Начинающий веб-мастер

Как удалить класс у элемента при отсутствии определенного дочернего элемента?

Суть задачи:
Сайт на WP запиленный непонятно кем.
Попросили поправить маленький косяк:
Ко всем ссылкам через плагин добавляется класс (например, myclass) для создания эффекта lightbox для увеличения картинок.
Данный класс вешается также и на обычные ссылки, и при переходе по обычной ссылке внутренние страницы пытаются открыться во всплывающем окне.

Как я думаю можно было бы решить проблему: сделать проверку на наличие внутри ссылки картинки, и при ее отсутствии удалить класс у ссылки.

Вот как выглядит код картинки внутри ссылки на сайте:

<a href="picture.jpg" class="myclass"><img src="picture.jpg"></a>

Пробовал написать такое:

$(document).ready(function() {
   var anyf = $('a').children('img').length;
   if (anyf < 1) 
      {
        $('.myclass').removeClass('myclass')
      };
  }
    )

Но код делает абсолютно не то, что хотелось бы.

Убрать автоматическое добавление класса не вариант, тк сайтом занимаются "тетеньки", которые новость просят опубликовать хоть кого-нибудь.
Отключить плагин и поставить другой тоже не получится (шаблон написан так, что при отключении плагина начинают вылезать ошибки на разных страницах).
  • Вопрос задан
  • 245 просмотров
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Кто должен отсутствовать и какой класс надо удалить:

const childSelector = 'img';
const className = 'myclass';

Удаляем:

$(`.${className}:not(:has(> ${childSelector}))`).removeClass(className);

или

document.querySelectorAll(`.${className}`).forEach(n => {
  n.classList.toggle(className, !!n.querySelector(`:scope > ${childSelector}`));
});

или

const elems = document.getElementsByClassName(className);
for (let i = elems.length; i--;) {
  if (!Array.prototype.some.call(elems[i].children, n => n.matches(childSelector))) {
    elems[i].classList.remove(className);
  }
}
Ответ написан
@MrTimon
Как вариант удалить все класы "myclass" и добавить только там где нужно самому, аля:
<script>
  $(document).ready(function() {
      $('a.myClass').removeClass('myClass');
      $('img').parent('a').addClass('myClass');
  });
</script>


Можно немножко усложнить и перебирать все имиджи детально и искать парент ссылки где src имиджа равно href параметру ссылки и только им добавлять клас.

другой способ перебрать все ссылки каторые имеют имдж как сделали вы толко надо так:
$(document).ready(function() {
      $('a.myClass').filter(function(item) {
            return $('>img',$(item)).length == 0
      }).removeClass('myClass');
  });


Должно работать
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы