Skip to content

Commit fb4b054

Browse files
fix a11y issue with aria describedby attribute in the audio component
1 parent f72e7f1 commit fb4b054

File tree

3 files changed

+24
-10
lines changed

3 files changed

+24
-10
lines changed

src/js/audio-player.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@ audioWrappers.forEach((wrapper: HTMLElement, index: number) => {
1111

1212
const audioElem = wrapper.querySelector('audio') as HTMLAudioElement;
1313

14+
const titleElemId = `${wrapper.querySelector('.audio__title')?.id}`;
15+
1416
const { btnOnly, size, outline, playIcon } = wrapper.dataset;
1517

1618
const props = {
1719
id: `audio-player-${index}`,
20+
titleId: titleElemId,
1821
btnOnly: btnOnly !== undefined,
1922
outline: outline !== undefined,
2023
audio: audioElem,
@@ -24,7 +27,6 @@ audioWrappers.forEach((wrapper: HTMLElement, index: number) => {
2427

2528
render(<AudioPlayer {...props} />, root);
2629

27-
wrapper.style.display = 'none';
28-
29-
wrapper.parentNode?.insertBefore(root, wrapper.nextSibling);
30+
audioElem.style.display = 'none';
31+
audioElem.parentNode?.insertBefore(root, audioElem.nextSibling);
3032
});

src/js/components/audio.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type AudioPlayerState = {
2323

2424
interface AudioPlayerProps {
2525
id: string;
26+
titleId: string;
2627
audio: HTMLAudioElement;
2728
btnOnly?: boolean;
2829
playIcon?: string;
@@ -35,7 +36,7 @@ class AudioPlayer extends Component<AudioPlayerProps, AudioPlayerState> {
3536

3637
constructor(props: AudioPlayerProps) {
3738
super(props);
38-
39+
console.log(props);
3940
this.state = {
4041
playing: false,
4142
duration: props.audio.duration,
@@ -115,18 +116,28 @@ class AudioPlayer extends Component<AudioPlayerProps, AudioPlayerState> {
115116
};
116117

117118
render(
118-
{ id, btnOnly, outline, playIcon = 'play', size }: AudioPlayerProps,
119+
{
120+
id,
121+
titleId,
122+
btnOnly,
123+
outline,
124+
playIcon = 'play',
125+
size
126+
}: AudioPlayerProps,
119127
{ duration, currentTime, muted, playing }: AudioPlayerState
120128
) {
121129
const btnClasses = `button button--primary ${
122130
size && `button--${size}`
123131
} ${outline && 'button--outline'}`;
124132

133+
const ariaDescribedby =
134+
titleId && titleId != 'undefined' ? { 'aria-describedby': titleId } : {};
135+
125136
const playBtn = (
126137
<button
127138
class={btnClasses}
128139
aria-label={playing ? 'Pause' : 'Listen'}
129-
aria-describedby="midd-audio-title-1"
140+
{...ariaDescribedby}
130141
onClick={this.handleBtnClick}
131142
>
132143
<span class="audio__button-text mr-2">
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
1-
<div class="audio {{ paragraph ? "paragraph--audio": ""}}">
1+
{% set titleId = random(1234) %}
2+
<div class="audio {{ paragraph ? "paragraph--audio": ""}} js-audio">
23
{% if panopto %}
34
<div class="audio__embed">
45
<iframe aria-label="Audio player" src="https://midd.hosted.panopto.com/Panopto/Pages/Embed.aspx?id=f9b9f6b5-f52c-40f8-962b-db0b6b214532&v=1" frameborder="0" allowfullscreen allow="autoplay"></iframe>
56
</div>
67
{% else %}
7-
<div class="js-audio">
8+
<div class="">
89
<audio controls>
910
<source src="https://www.middlebury.edu/institute/sites/www.middlebury.edu.institute/files/2018-02/Ace_Your_Interview_v2.mp3" type="audio/mpeg">
1011
</audio>
1112
</div>
1213
{% endif %}
1314
<div class="audio__body">
14-
<h3 class="audio__title" id="midd-audio-title-1">Audio title</h3>
15-
<p class="audio__text" id="midd-audio-text-1">Lorem ipsum dolor, sit amet consectetur adipisicing elit. Reiciendis commodi placeat, perferendis ratione vitae officiis vero. Commodi ullam fugiat expedita qui veritatis adipisci minus quod neque! Voluptatum tempora iure quo.</p>
15+
<h3 class="audio__title" id="midd-audio-title-{{titleId}}">Audio title</h3>
16+
<p class="audio__text" id="midd-audio-text-{{titleId}}">Lorem ipsum dolor, sit amet consectetur adipisicing elit. Reiciendis commodi placeat, perferendis ratione vitae officiis vero. Commodi ullam fugiat expedita qui veritatis adipisci minus quod neque! Voluptatum tempora iure quo.</p>
1617
{% include 'partials/transcript.twig' with { id: random(1234) } %}
1718
</div>
1819
</div>

0 commit comments

Comments
 (0)