Как изменить атрибут aria с помощью Jquery?

У меня есть следующий код, в котором я хотел бы изменить атрибут aria-describedby, чтобы он соответствовал тексту <h3></h3>, содержащемуся в этом div. Мне нужно идентифицировать каждый div по классу .slick-slide.

  • Обратите внимание, что обычно на странице с классом slick-slide у меня есть 3–6 элементов div.
<div class = "cards__card cards__card--1 cards__slide section--light slick-slide slick-current slick-active" data-slick-index = "0" aria-hidden = "false" tabindex = "0" role = "tabpanel" id = "slick-slide00" aria-describedby = "slick-slide-control00">
    <div class = "cards__slide-wrapper self-center">
        <h3 class = "section__header cards__header heading heading--h3 ">--- HEADER ---</h3>
        <div class = "cards__item cards__item--copy">
            <p> ---  SAMPLE TEXT ---</p>
        </div>
        <div class = "cards__pagination cards__pagination--black">
            <p class = "copy--disclaimer">1 / 4</p>
        </div>
    </div>
</div>

Я пробовал следующее, но безрезультатно:

$('div .slick-slide').each(function () {
    var h3 = $(this).closest("h3").text(); 
    $(this).attr("aria-describedby", h3);
});

Заранее спасибо!

div .slick-slide, наверное, должно быть div.slick-slide. Пробел означает поиск потомка div, но .slick-slide — это класс самого div.
Barmar 20.08.2024 02:53
.closest() должно быть .find(). closest() ищет содержащий элемент, а не то, что содержится внутри.
Barmar 20.08.2024 02:53
aria-describedby ожидает список других элементов id, а не просто текст.
Kaiido 20.08.2024 08:51
Поведение ключевого слова "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) для оценки ваших знаний,...
2
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

.closest() jQuery выполняет поиск по иерархии, тогда как вы хотите искать внутри контейнера .slick-slide.

Вместо этого используйте .find() для поиска внутри элемента.

Как упоминалось в нескольких комментариях, aria-describedby не является атрибутом произвольного текста. Его значение должно быть списком...

id элементов, описывающих объект.

Я бы подошел к этому, получив или создав идентификатор <h3> и присвоив его атрибуту.

Кроме того, возможно, вам не обязательно нужен jQuery

document.querySelectorAll('.slick-slide[id]').forEach((c) => {
  const heading = c.querySelector('h3');
  if (heading) {
    if (!heading.id) {
      heading.id = `${c.id}--heading`;
    }
    c.setAttribute('aria-describedby', heading.id);
  }
  
  console.info('aria-describedby:', c.getAttribute('aria-describedby'));
});
<div
  class = "cards__card cards__card--1 cards__slide section--light slick-slide slick-current slick-active"
  data-slick-index = "0"
  aria-hidden = "false"
  tabindex = "0"
  role = "tabpanel"
  id = "slick-slide00"
  aria-describedby = "slick-slide-control00"
>
  <div class = "cards__slide-wrapper self-center">
    <h3 class = "section__header cards__header heading heading--h3">
      --- HEADER ---
    </h3>
    <div class = "cards__item cards__item--copy">
      <p>--- SAMPLE TEXT ---</p>
    </div>
    <div class = "cards__pagination cards__pagination--black">
      <p class = "copy--disclaimer">1 / 4</p>
    </div>
  </div>
</div>

Спасибо, Фил. Я попробовал обе версии вашего кода, но ни одна из них у меня не работает. Не понимаю почему, мне кажется, что редактировать, неважно, это работает! Спасибо!

Andrew Rout 20.08.2024 03:12

На данный момент я против, так как код может делать то, что задумано, но установка обычного текста в качестве значения атрибута, заканчивающегося на by, недействительна. Требуется идентификатор.

Andy 20.08.2024 19:36

@Энди, это вряд ли имеет отношение к реальной проблеме, которую пытался решить ОП

Phil 21.08.2024 01:12

@Энди, я обновил ответ, указав правильное значение aria-describedby

Phil 21.08.2024 01:38

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