Отключите субтитры для нескольких видео с помощью глобальной кнопки

У меня есть страница, содержащая несколько видео HTML5 с разными заголовками (webvtt). Элементы управления видео скрыты. У меня есть кнопка "добавить субтитры" с идентификатором #check. Если пользователь нажимает эту кнопку, ВСЕ видео должны отображать подписи, а если флажок снят, подписи должны быть скрыты. Что у меня так далеко:

Скрыть подписи по умолчанию:

var video = document.querySelector('.video');
var tracks = video.textTracks;
var track = tracks[0];

$(document).ready(function() {
  track.mode = 'hidden';
});

Если кнопка отмечена / не отмечена, показать / скрыть подписи:

$(function() {
  $('#check').click(function() {
    if($(this).is(':checked')) {
      track.mode = 'showing';
    }  else {
      track.mode = 'hidden';
    }
  });
});

Это отлично работает, НО только для первого видео (так как track [0] предоставляет значение только первого трека). Могу ли я что-нибудь сделать, чтобы решить эту проблему, или я нахожусь на совершенно неверном пути?

1 ответ

Решение

Вам просто нужно повторить tracks, как это:

$(function() {
  $('#check').click(function() {
    var isChecked = $(this).is(':checked');
    for (var index = 0; index < tracks.length; index++) {
        tracks[index].mode = (isChecked ? 'showing' : 'hidden');
    }
  });
});

РЕДАКТИРОВАТЬ

Причина, по которой затрагивается только первое, заключается в том, что вы выбираете самое первое видео. Измените свой первый код на:

var video = document.querySelectorAll('.video'); //querySelector selects the first match only
var videoTrackSets = [];
for (var videoIndex = 0; videoIndex < video.length; videoIndex++) {
    videoTrackSets.push(video[videoIndex].textTracks);
}

$(document).ready(function() {
    for (var setIndex = 0; setIndex < videoTrackSets; setIndex++)
        for (var trackIndex = 0; trackIndex < videoTrackSets[setIndex].length; trackIndex++)
            videoTrackSets[setIndex][trackIndex].mode = 'hidden';
});

и измените второй код на

$(function() {
  $('#check').click(function() {
    var isChecked = $(this).is(':checked');
    for (var setIndex = 0; setIndex < videoTrackSets.length; setIndex++)
        for (var trackIndex = 0; trackIndex < videoTrackSets[setIndex].length; trackIndex++)
            videoTrackSets[setIndex][trackIndex].mode = (isChecked ? 'showing' : 'hidden');
  });
});
Другие вопросы по тегам