Как адаптировать функцию, чтобы сделать ее целевым элементом, который ее вызвал? - PullRequest
1 голос
/ 12 июля 2020

Я написал следующий код в Bootstrap 4, чтобы воспроизводить / приостанавливать видео при нажатии на него, он также переключает небольшой img динамика, который находится под видео. хотите дублировать эту функцию для каждой пары видео / img, которая есть на моей странице, есть ли способ переписать эту функцию, чтобы она влияла только на видео, на которое было выполнено нажатие, и как-то заставить ее изменить соответствующий img? Есть ли способ использовать класс?

<div class="col bg-primary p-0" style="width: 100%; max-width: 787px;">
<div class="bg-danger">
<video id="c20-vid" style="width: 100%; max-width: 787px;" preload="metadata" poster="#.png" playsinline loop>
<source src="#.mp4" type="video/mp4">
</video>
</div>
<div class="text-center captions bg-warning">
<img src="img/muted_icon.png" width="15em" id="c20-mute-icon" />
</div>
</div>

и вот JavaScript:


function playme() {
    // in this case it's the element that was clicked
    var video = this;
    var muteicon = document.getElementById("c20-mute-icon");
    
    if(video.paused) {
        video.play();
        muteicon.src="img/unmuted_icon.png";
    } 
    else {
        video.pause();
        muteicon.src="img/muted_icon.png";
    }
}

document.getElementById("c20-vid").addEventListener("click", playme);

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Похоже, вы хотите сделать две вещи:

  1. Напишите обработчик событий, который знает о своем контексте вызова, без жесткого кодирования этого контекста.
  2. Найдите элемент HTML относительно другого элемента.

Давайте рассмотрим их по отдельности, а затем рассмотрим пример, который делает и то, и другое.

Написание обработчика событий который знает о контексте его вызова

Это то, для чего this:)

Из статьи MDN на this:

Когда функция используется в качестве обработчика событий, this устанавливается на элемент, на котором размещен слушатель (некоторые браузеры не следуют этому соглашению для слушателей, динамически добавляемых методами, отличными от addEventListener ()).

Проще говоря, this - это специальная переменная, значение которой изменяется в зависимости от того, откуда вызывается функция.

Этот вопрос SO касается областей и контекстов в JavaScript подробнее тщательно .

* 10 35 * Поиск элемента HTML относительно другого элемента

Некоторая комбинация Element.querySelector и свойств родительского / дочернего / родственного интерфейса узла DOM обычно достаточно, чтобы выполнить эту работу.

Собираем все вместе

Вот фрагмент, который применяет эти идеи к вашей HTML структуре (заключенной во внешний div):

// Define event handler
function toggleMute(e) {
    // "this" comes from the calling context
    // in this case it's the element that was clicked
    var video = this;
    // get the video's parent element and find the first img element inside it
    var muteicon = video.parentElement.querySelector('img');
    
    // do some stuff with these elements
    if(video.muted) {
        video.muted = false;
        video.style.background = "green"
        muteicon.style.background = "yellow";
    } 
    else {
        video.muted = true;
        video.style.background = "orange"
        muteicon.style.background = "teal";
    }
}

// Attach handler to video element, listening for "click" event
document.getElementById('my-vid').addEventListener("click", toggleMute);
video { height: 100px; width: 100px; background: green; }
img { height: 50px; width: 50px; background: yellow; }
<div>
  <video id="my-vid">
      <source src="my.mp4">
  </video>
  <br>
  <img src="img/muted_icon.png" id="speaker-icon" />
</div>

Дополнительные возможности

Есть и другие способы информировать обработчик событий о своем контексте. Вы также можете использовать объект события, который отображается при отправке события, или явно передать this в HTML. См. Примеры ниже. Я предпочитаю избегать встроенных обработчиков в HTML, поэтому я бы выбрал второй или третий методы.

function ping(target) {
  console.log(target);
  target.classList.toggle('pinged');
  const next = target.nextElementSibling;
  next.classList.toggle('pinged');
  next.nextElementSibling.classList.toggle('pinged');
  
}

function pong() {
  console.log(this);
  this.classList.toggle('ponged');
  this.nextElementSibling.classList.toggle('ponged');
  this.previousElementSibling.classList.toggle('ponged');
}

function pang(e) {
  console.log(e.target);
  e.target.classList.toggle('panged');
  const prev = e.target.previousElementSibling;
  prev.classList.toggle('panged');
  prev.previousElementSibling.classList.toggle('panged');
}

// 'ping' attached to element 'one' inline, in HTML
document.getElementById('two').addEventListener("click", pong);
document.getElementById('three').addEventListener("click", pang);
img {max-height: 200px; max-width: 200px;}
.pinged {filter: sepia(80%)}
.ponged {transform: scale(0.5)}
.panged {opacity: 0.5;}
image
0 голосов
/ 12 июля 2020

In HTML:

<video id=“my-vid" onclick="toggleMute('my-vid', 'my-img');">
    <source src=“my.mp4”>
</video>
<img id="my-img" src="img/muted_icon.png" id=“speaker-icon"  />

In javascipt:

function toggleMute(vid, img) { // add parameters
  var video = document.getElementById(vid); // use parameter
  var muteicon = document.getElementById(img); // use parameter
    
  if(video.muted) {
    video.muted = false;
    muteicon.src="img/unmuted_icon.png";
  } 
  else {
    video.muted = true;
    muteicon.src="img/muted_icon.png";
  }
}

Я не уверен, что это то, как вы получаете доступ к видео для отключения звука - это вам решать вон / будь уверен.

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