#javascript #api #dom #dynamic
Вопрос:
Я новичок в JS и пытаюсь создавать динамичные веб — сайты и учиться на них. Однако я борюсь, так как перепробовал несколько кодов и проб, но у меня всегда есть дубликат видео.
Это HTML:
<div class="container" id="cnn">
</div>
Это код JS:
function enter() {
var video = document.createElement("video");
video.type = "video/mp4";
video.src = "../images/myMovie.mp4";
video.autoplay = true;
video.muted = true;
video.id = "vdd"
document.body.appendChild(video);
var step2 = false;
video.addEventListener("timeupdate", function(){
// current time is given in seconds
if(this.currentTime >= 1) {
// pause the playback
this.pause();
this.remove();
step2 = true;
if (step2 == true){
document.getElementById("cnn").style.display = "inline"
console.log("Test 1");
const x = document.createElement("video");
const brr = document.createElement("div");
x.type = "video/mkv";
x.src = "../images/space.mkv";
x.autoplay = true;
x.muted = true;
x.id = "vdd1"
brr.appendChild(x);
// add the newly created element and its content into the DOM
const currentDiv = document.getElementById("cnn");
currentDiv.appendChild(brr);
}
}
});
}
Комментарии:
1. Что должен делать сценарий? Прямо сейчас он добавляет новый
<video>
элемент сsrc="../images/space.mkv"
указанием того, когда когда-либоtimeupdate
происходит событие ( «когда время, указанноеcurrentTime
атрибутом, было обновлено. Частота событий зависит от загрузки системы, но будет передаваться примерно от 4 Гц до 66 Гц (при условии, что для запуска обработчиков событий требуется не более 250 мс).» ) и.currentTime >= 1
.
Ответ №1:
Пожалуйста, удалите дочерние элементы из узла, прежде чем добавлять новый элемент в этот узел
const currentDiv = document.getElementById("cnn");
currentDiv.innerHTML = "";
currentDiv.appendChild(brr);
Комментарии:
1. Это взлом. Не устраняет основную проблему
<video>
, связанную с тем, что элемент добавляется более одного раза.
Ответ №2:
Попробуйте получить доступ к элементу напрямую, чтобы удалить его, вместо того, чтобы ссылаться на «это», скорее запросите его из DOM и удалите его таким образом. Вы можете получить к нему доступ через
document.getElementById("vdd").remove();
Если я не неправильно понял, какое видео было продублировано, если есть проблема со вторым видео, вы никогда не добавляете div в документ, вы только добавляете новое видео в элемент div, элемент не будет отображаться из-за этого.
Дайте мне знать, если я неправильно понял вашу проблему. 🙂
Ответ №3:
Вы создаете более одного <video>
. video.addEventListener("timeupdate", function () { })
вызывается несколько раз, прежде чем первый video
будет эффективно удален.
Я бы предложил инвертировать использование step2
флага, чтобы убедиться, что шаг 2 выполняется только один раз.
var video = document.createElement("video");
video.type = "video/mp4";
video.src =
"http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4";
video.autoplay = true;
video.muted = true;
video.id = "vdd";
document.body.appendChild(video);
var step2 = false;
video.addEventListener("timeupdate", function () {
// current time is given in seconds
if (this.currentTime >= 1) {
// pause the playback
this.pause();
this.remove();
if (step2 === false) { // <-- SEE HERE
step2 = true; // <-- SEE HERE
document.getElementById("cnn").style.display = "inline";
console.log("Test 1");
const x = document.createElement("video");
const brr = document.createElement("div");
x.type = "video/mp4";
x.src =
"http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4";
x.autoplay = true;
x.muted = true;
x.id = "vdd1";
brr.appendChild(x);
// add the newly created element and its content into the DOM
const currentDiv = document.getElementById("cnn");
currentDiv.appendChild(brr);
}
}
});
<!DOCTYPE html>
<html>
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
</head>
<body>
<div class="container" id="cnn"></div>
<script src="index.js"></script>
</body>
</html>