Не могу остановить видео после закрытия модального режима в HTML5 - PullRequest
0 голосов
/ 15 марта 2020

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

Вот html для обоих видео с модальным:

<div id="popup1" class="overlay">
   <div class="popup">
       <h2>3B - Bum Bum Brasil</h2>
       <a class="close" href="#">&times;</a>
       <div class="content">
  <center>  <video width="90%" id="video" height="90%" controls>
<source src="videos/3b.mp4" type="video/mp4">

 Your browser does not support the video tag.
</video></center>
       </div>
 </div></div>

<div id="popup2" class="overlay">
   <div class="popup">
       <h2>Six Pack</h2>
       <a class="close" href="#">&times;</a>
       <div class="content">
  <center>  <video width="90%" id="video2" height="90%" controls>
<source src="videos/sixpack.mp4" type="video/mp4">

 Your browser does not support the video tag.
</video></center>
       </div>
 </div></div>

А вот javascript:


<script>
   var video = document.getElementById("video");
 function stopVid(){
      video.pause();
      video.currentTime = 0;

 }

var video2 = document.getElementById("video2");
 function stopVid(){
      video2.pause();
      video2.currentTime = 0;

 }


   $(".close").on('click', function(){
   stopVid();

   }
   );


      </script>

Ответы [ 3 ]

1 голос
/ 16 марта 2020

Добро пожаловать в Stack Overflow и поздравляем с первым вопросом.

Работа с несколькими значениями id может быть громоздкой, если у вас есть динамическая страница c с нефиксированным количеством элементов, которыми вы хотите манипулировать. Поэтому, если элемент <video> не находится в совершенно другом разделе страницы и нет другого способа, кроме как выбрать его с помощью getElementById, тогда я предлагаю использовать другой подход.

Обе .close и элементы video являются потомками (или внуками) элемента .popup. Это полезная информация! Это делает использование делегирование события очень многообещающим.

Большинство событий bubble . Это означает, что, например, когда ребенок запускает событие click, событие проходит вверх через каждого родителя, пока не достигнет тега <html>. Теперь мы можем прослушать щелчок на дочернем элементе и обработать его от родителя. Как прислушиваться к щелчку на .close, но обрабатывать его от каждого .popup. Больше нет необходимости в значениях id.

Выберите все элементы .popup. L oop над ними и слушайте их click события с addEventListener. Не используйте jQuery и Vanilla JavaScript переплетаются , и, на мой взгляд: лучше все-таки изучить Vanilla, так как это поможет вам лучше понять, как работает JavaScript.

В функции для события click вы захотите узнать, была ли нажата кнопка .close. Если есть, то остановите видео. Если нет, то ничего не делать. Каждое событие дает вам Event объект. Этот объект предоставляет вам информацию о типе события, элементе, вызвавшем событие, положении мыши и т. Д. c.

Свойство event.target - это элемент, по которому щелкают, который вызвал событие. Мы можем проверить, является ли это кнопка .click, используя метод .closest(). Если это не тот элемент, который мы ищем, он вернет null. В противном случае мы solid.

Затем используйте querySelector из текущего всплывающего окна, чтобы найти видео внутри него. У вас есть ваше видео! Теперь вы можете передать это функции stopVid и приостановить ее.

В приведенном ниже примере показаны все шаги, упомянутые выше в коде. Пожалуйста, дайте мне знать, если я был неясен, или у вас есть какие-либо вопросы.

// Get all popup <div> elements.
const popups = document.querySelectorAll('.popup'); 

/**
 * This stop function needs to know which 
 * <video> element you want to stop.
 */
function stopVideo(video) {
  video.pause();
  video.currentTime = 0;
}

/**
 * When clicking inside the popup, check
 * if the .close button is clicked. If it
 * is then pause the video if it is present.
 */
function onPopupClick(event) {
  const popup = this; // 'this' is element we are listening to.
  const close = event.target.closest('.close');
  if (close === null) {
    return; // Stop the function.
  }
  const video = popup.querySelector('video');
  if (video !== null) {
    stopVideo(video);
  }
}

// Loop over each popup.
for (const popup of popups) {
  popup.addEventListener('click', onPopupClick);
}

Удачи!

0 голосов
/ 15 марта 2020

Проблема здесь в том, что определение новой функции stopVid переопределяет первую, поэтому работает только самая последняя функция stopVid. Обходной путь для этой проблемы мог бы определить более общую c функцию для закрытия и остановки видео. Обратите внимание, что мое решение требует, чтобы кнопки закрытия имели атрибут video со значением id соответствующего элемента видео. Смотрите мое решение ниже:

<script>
  function stopVid(id){
    let video = document.getElementById(id);
    video.pause();
    video.currentTime = 0;
  }


  $(".close").forEach(c => {
    c.on('click', function(e){
      let id = e.target.getAttribute('video')
      stopVid(id);
    });
  });
</script>
0 голосов
/ 15 марта 2020

$ () Селектор возвращает массив элементов. Вы должны написать индекс для нужного элемента.

Если на вашей странице существует только один элемент с классом close , тогда получите доступ к этому

$('.close')[0].on('click', function(){
   stopVid();
})

В противном случае вам придется работать с идентификаторами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...