Как синхронизировать контент с HTML5 видео с помощью JavaScript? - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть форма, которая содержит некоторые поля ввода, имя, адрес электронной почты и т. Д., У меня есть видео (которое я не могу опубликовать здесь), в котором говорится девушка, например, адрес электронной почты неправильный, введите новый адрес электронной почты, пароль неверныйвведите правильный пароль, имя занято, пожалуйста, введите новое имя и т. д.,

Поэтому я хочу, чтобы когда пользователь вводил имя вместо отображаемого сообщения, например, хорошее имя, я хотел бы воспроизвести видео с надписью «о, это хорошо»name 'и наоборот,

вот jsfiddle для справки: сообщение проверки с использованием видео

вот что у меня есть

<!--PEN CODE-->
<div id="contactForm" class="contactForm">
    <div id="formHeader" class="formHeader">
        <h1 id="message">Contact Me</h1>
    </div>
    <div id="formBody" class="formBody">
        <form action="" method="POST" name="contactForm">
            <div class="inputContainer">
                <label for="userName">
                    <i class="fa fa-lg fa-fw fa-user"></i>
                </label>
                <input name="name" id="userName" type="text" placeholder="John Smith">
            </div>
            <div class="inputContainer">
                <label for="userEmail">
                    <i class="fa fa-lg fa-fw fa-envelope"></i>
                </label>
                <input name="email" id="userEmail" type="email" placeholder="jsmith@domain.com">
            </div>
            <div class="inputContainer">
                <textarea name="feedback" id="userMessage" rows="10" placeholder="Enter your message"></textarea>
            </div>
            <input id="submitBtn" class="submitBtn" type="submit" value="Send">
        </form>
    </div>
</div>
<center><p><em>NOTE: This form is for presentation only. Any form data entered is not submitted</em></p></center>
<!--END PEN CODE-->


    <div class="video=wrapper">

      <video id="video1" width="420">
    <source src="https://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4">
  </video>


    </div>

Вот JS у меня до сих пор

(function() {
    "use strict";
    var //GLOBAL VARIABLES
    input,
            container,
            //CSS CLASSES
            classSuccess = "success",
            classError = "error",
            //FORM VALIDATOR
            formValidator = {
                init: function() {
                    this.cacheDom();
                    this.bindEvents();
                },
                cacheDom: function() {
                    //MAIN PARENT ELEMENT
                    this.contactForm = document.getElementById("contactForm");
                    //MAIN FORM ELEMENTS
                    this.formHeader = document.querySelector("#formHeader h1");
                    this.formBody = document.getElementById("formBody");
                    this.inputContainer = document.getElementsByClassName("inputContainer");
                    //USER INPUT ELEMENTS
                    //INPUT FIELDS
                    this.fields = {
                        userName: document.getElementById("userName"),
                        userEmail: document.getElementById("userEmail"),
                        userMessage: document.getElementById("userMessage")
                    };
                    this.submitBtn = document.getElementById("submitBtn");
                },
                bindEvents: function() {
                    var i;
                    //RUN RULES ON SUBMIT BUTTON CLICK
                    this.submitBtn.onclick = this.runRules.bind(this);
                    //BIND EVENTS TO EACH INPUT FIELD
                    for (i in this.fields) {
                        if (this.fields.hasOwnProperty(i)) {
                            //VARIABLES
                            input = this.fields[i];
                            container = input.parentElement;
                            //RUN RULES WHEN INPUT HAS FOCUS
                            input.onfocus = this.runRules.bind(this);
                            //RESET ERRORS WHEN CONTAINER IS CLICKED
                            container.onclick = this.resetErrors.bind(this, input);
                        }
                    }
                },
                runRules: function(evnt) {
                    var target = evnt.target,
                            type = evnt.type;
                    //IF EVENT ON SUBMIT BUTTON
                    if (target === this.submitBtn) {
                        //PREVENT FORM SUBMITTION
                        this.preventDefault(evnt);
                        //IF INPUT HAS FOCUS
                    } else if (type === "focus") {
                        //RESET CLASSLIST
                        this.resetClassList(target.parentElement);
                        //RESET ERRORS
                        this.resetErrors(target);
                        return false;
                    }
                    //RESET CLASSLIST
                    this.resetClassList();
                    //CHECK FIELDS
                    this.checkFields();
                },
                preventDefault: function(evnt) {
                    //PREVENT DEFUALT
                    evnt.preventDefault();
                },
                checkFields: function() {
                    var i,
                            validCount = 0,
                            //EMAIL FILTER
                            filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
                    //CYLCE THROUGH INPUTS
                    for (i in this.fields) {
                        if (this.fields.hasOwnProperty(i)) {
                            input = this.fields[i];
                            //CHECK IF FIELD IS EMPTY
                            if (input.value === "") {
                                //ADD ERROR CLASS
                                this.addClass(input, classError);
                                //CHECK IF EMAIL IS VALID
                            } else if (i === "userEmail" && !filter.test(input.value)) {
                                //ADD ERROR CLASS
                                this.addClass(input, classError);
                            } else {
                                //FIELD IS VALID
                                this.addClass(input, classSuccess);
                                validCount += 1;
                            }
                        }
                    }
                    //IF ALL FEILDS ARE VALID
                    if (validCount === 3) {
                        //SUBMIT FORM
                        this.submitForm();
                    }
                },
                addClass: function(input, clss) {
                    container = input.parentElement;
                    //IF INPUT HAS ERROR
                    if (clss === classError) {
                        //SHOW ERROR MESSAGE
                        this.errorMessage(input);
                    }
                    //ADD CLASS
                    input.parentElement.classList.add(clss);
                },
                errorMessage: function(input) {
                    var message;
                    //IF USERNAME HAS ERROR
                    if (input === this.fields.userName) {
                  //grab data from video and interact it with html5 form
                  var videoElement = document.getElementById('video1')[0];
                  videoElement.addEventListener('loadmetadata', function(){
                  this.currentTime =20;
                }, false)

                        //ELSE IF USEREMAIL HAS ERROR
                    } else if (input === this.fields.userEmail) {
            //grab data from video and interact it with html5 form
            var videoElement = document.getElementById('video1')[0];
            videoElement.addEventListener('loadmetadata', function(){
            this.currentTime =70;
          }, false)
                        //ELSE IF USERMESSAGE HAS ERROR
                    } else if (input === this.fields.userMessage) {
            //grab data from video and interact it with html5 form
            var videoElement = document.getElementById('video1')[0];
            videoElement.addEventListener('loadmetadata', function(){
            this.currentTime =50;
          }, false)
                    }
                    this.renderError(input, message);
                },
                renderError: function(input, message) {
                    var html;
                    //GET INPUT CONTAINER
                    container = input.parentElement;
                    //RENDER HTML
                    html = document.createElement("div");
                    html.setAttribute("class", "message");
                    html.innerHTML = message;
                    //IF MESSAGE ELEMENT DOESN'T EXIST
                    if (!container.getElementsByClassName("message")[0]) {
                        //INSERT MESSAGE TO INPUT CONTAINER
                        container.insertBefore(html, container.firstElementChild);
                    }
                },
                resetClassList: function(input) {
                    var i;
                    //IF TARGETING SPECIFIC INPUT
                    if (input) {
                        //GET INPUT CONTAINER
                        container = input.parentElement;
                        //REMOVE CLASSES
                        container.classList.remove(classError, classSuccess);
                        //FOCUS ON INPUT FIELD
                        input.focus();
                    } else {
                        for (i in this.fields) {
                            if (this.fields.hasOwnProperty(i)) {
                                //REMOVE CLASSES FROM ALL FIELDS
                                this.fields[i].parentElement.classList.remove(classError, classSuccess);
                            }
                        }
                    }
                },
                resetErrors: function(input) {
                    //GET INPUT CONTAINER
                    container = input.parentElement;
                    //IF CONTAINER CONTAINS ERROR
                    if (container.classList.contains(classError)) {
                        //RESET CLASSES
                        this.resetClassList(input);
                    }
                },
                submitForm: function() {
                    var waitForAnimation;
                    //ADD SUCCESS CLASS
                    this.contactForm.classList.add(classSuccess);
                    //WAIT FOR ANIMATION TO FINISH
                    this.changeHeader("Sent Succesfully");
                    //WAIT FOR ANIMATION TO FINISH
                    setTimeout(this.changeHeader.bind(this, "Thank you for your feedback"), 1200);
                },
                changeHeader: function(text) {
                    //CHANGE HEADER TEXT
                    this.formHeader.innerHTML = text;
                }
            };


    //INITIATE FORM VALIDATOR
    formValidator.init();


}());

**

ПРИМЕЧАНИЕ: вы можете использовать любое видео, важно рабочее решение

**

к сожалению, это не работает должным образом

Что я делаю не так в моем коде?

1 Ответ

0 голосов
/ 12 декабря 2018

Во-первых, похоже, что вы смешиваете код jQuery с нативным JS.Вы не выбираете элемент видео с помощью:

document.getElementById("video1")[0];

Для этого требуется:

document.getElementById("video1");

Далее вы устанавливаете прослушиватель событийна элемент, который может или не может быть уволен.Давайте удостоверимся, что наш обработчик событий может быть запущен путем принудительной выборки видео.

В вашем примере много чего происходит, поэтому я разбил его на мелкие биты.

  1. Кнопка эмулирует ошибочное поле формы.
  2. Затем загрузите видео, чтобы сработало событие canplay.
  3. Затем запишите нажатие кнопки и установите URL-адрес видео для принудительной загрузки видео
  4. Наконец, используйте Async / Await и воспроизведите видео.
    • Примечание. Видео может не воспроизводиться, если пользовательский агент запрещает это делать

let vidElement = document.getElementById('video1');
vidElement.addEventListener('canplay', playVideo);

document.querySelector('button').addEventListener('click', loadvideo);

function loadvideo() {
  vidElement.src = "https://www.w3schools.com/html/mov_bbb.mp4";
}

async function playVideo() {
  vidElement.currentTime = 70;
  console.log("Playing video from: ", vidElement.currentTime);
  await vidElement.play().catch(e => console.log("error: ", e.message));
}
<button>Make Form Error</button>
<br>
<video id="video1" width="420">
    <source type="video/mp4">
  </video>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...