День 11 курса JavaScript 30 Веса Боса состоял из добавления элементов управления воспроизведением видео в видео MP4. Программа добавила пользовательские элементы управления прямо на изображение. Это включало широкое использование кода JavaScript.
Во-первых, нам нужно было получить наши элементы из HTML. На самом деле я знал, как это сделать, с небольшими изменениями синтаксиса после того, как Бос показал нам, как он это сделал.
const player = document.querySelector(".player"); const video = player.querySelector('.viewer'); const progress = player.querySelector(".progress"); const progressBar = player.querySelector(".progress__filled") const toggle = player.querySelector(".toggle"); const skipButtons = player.querySelectorAll("[data-skip]"); //skip ahead or back buttons const ranges = player.querySelectorAll(".player__slider");
Next Bos создал несколько функций для функций.
Для кнопки воспроизведения.
function togglePlay(){ if(video.paused){ video.play(); }else { video.pause(); } };
В качестве альтернативы Бос показал нам, как сделать то же самое с помощью тернарного оператора.
/*alternate way const method = video.paused ? 'play' : 'pause'; video[method]() //since method is a string */
Я все еще привыкаю к тому, что является струной, а что нет. Поэтому я нашел этот способ немного запутанным.
Затем Бос показал нам, как обновить значки на кнопке воспроизведения.
function updatebutton(){ const icon = this.paused ? '►': '❚ ❚'; //use 'this' since variable is bound to 'video' toggle.textContent = icon; }
Кнопки перемотать вперед на 25 секунд и перемотать назад на 10 секунд.
function skip(){ video.currentTime += parseFloat(this.dataset.skip); /* this.dataset.skip is a string, use parseFloat. refers to object with one of these values inside -10s or +25s */ }
Эта функция затрагивала панели управления громкостью и скоростью воспроизведения.
function handleRangeUpdate(){ video[this.name] = this.value; //volume or playbackRate is attached to value }
Эта функция обрабатывала индикатор выполнения.
function handleProgress(){ const percent = (video.currentTime / video.duration ) * 100; progressBar.style.flexBasis = `${percent}%`; }
Последняя функция управляла функцией очистки.
function scrub(e) { const scrubTime =(e.offsetX/ progress.offsetWidth) * video.duration; // position clicked / entire width * entire duration video.currentTime = scrubTime; }
Вот все прослушиватели событий.
video.addEventListener('click', togglePlay); video.addEventListener('play', updatebutton); video.addEventListener('pause', updatebutton); video.addEventListener('timeupdate', handleProgress); toggle.addEventListener('click', togglePlay); skipButtons.forEach(button => button.addEventListener('click', skip)); ranges.forEach(range => range.addEventListener('change', handleRangeUpdate)); ranges.forEach(range => range.addEventListener('mousemove', handleRangeUpdate)); let mousedown = false; progress.addEventListener('click', scrub); progress.addEventListener('mousemove', (e) => mousedown && scrub(e)); progress.addEventListener('mousedown', () => mousedown = true); progress.addEventListener('mousemove', () => mousedown = false);
Я нашел логику простой для понимания, но опять же, большая часть синтаксиса была для меня новой. Я не уверен, что смогу повторить это самостоятельно. Я попробую найти файл MP4 и воспроизвести эту программу.
Следите за моими заметками по JavaScript 30, пока я работаю над курсом.