简体   繁体   English

在新创建的视频元素中创建/删除元素

[英]Create/delete element inside newly created video element

I am creating a new video element and then wants to show a spinner when video has started loading until it gets the first frame and then delete that element. 我正在创建一个新的video元素,然后想在视频开始加载时显示微调框,直到它获得第一帧,然后再删除该元素。 Following is my code - 以下是我的代码-

var videoElem, src;
videoElem = document.createElement("video");
videoElem.src = src;

var preloader = '<div class="preloader-wrapper"><div class="spinner-layer"><div class="circle-clipper left"><div class="circle"></div></div>' + '<div class="gap-patch"><div class="circle"></div></div><div class="circle-clipper right"><div class="circle"></div></div></div></div>';

//renders when video has started loading - show preloader
videoElem.addEventListener("loadstart", function () {
    console.log("Video has started loading...!");
    //jQuery(preloader).insertBefore(videoElem); //works fine but I don't know how to delete the preloader in the loadeddata eventlistener
    videoElem.appendChild(preloader);
});

//renders when is loaded - delete preloader
videoElem.addEventListener("loadeddata", function () {
    console.log("Video has loaded successfully!");
    videoElem.removeChild(preloader);
});

The appendChild and removeChild is not working. appendChildremoveChild不起作用。 Gives error : 给出错误:

Uncaught TypeError: Failed to execute 'removeChild' on 'Node': parameter 1 is not of type 'Node' at HTMLVideoElement.eval 未捕获的TypeError:无法在“节点”上执行“ removeChild”:HTMLVideoElement.eval上的参数1不是“节点”类型

You need to parse your string to an HTML Node in order to append it to another HTML Nodes . 您需要将字符串解析到HTML Node ,以便将其附加到另一个HTML Nodes

You can do it with DOMParser : 您可以使用DOMParser做到这一点:

var preloader = new DOMParser().parseFromString('<div class="preloader-wrapper"><div class="spinner-layer"><div class="circle-clipper left"><div class="circle"></div></div>' + '<div class="gap-patch"><div class="circle"></div></div><div class="circle-clipper right"><div class="circle"></div></div></div></div>', 'text/html');

I have got the solution. 我有解决方案。 I was trying to use removeChild(preloader) . 我试图使用removeChild(preloader) Preloader here returns the whole html element. Preloader在这里返回整个html元素。 Therefore, by removing it by id solved my problem. 因此,通过id将其删除解决了我的问题。 Also, preloader element adding inside a video tag is wrong approach and would not show the loader. 另外,在视频标签内添加预加载器元素是错误的方法,并且不会显示加载器。 For this, I took the id of main div element and then added/removed the preloader as follows - 为此,我获取了主div元素的ID,然后按如下所示添加/删除了预加载器-

var videoLoader = '<div id="videoLoader" class="preloader-wrapper"><div class="spinner-layer"><div class="circle-clipper left"><div class="circle"></div></div>' + '<div class="gap-patch"><div class="circle"></div></div><div class="circle-clipper right"><div class="circle"></div></div></div></div>';

var parentDiv = document.getElementById('parentDiv');
parentDiv.insertAdjacentHTML('afterbegin',videoLoader); // add in loadstart listener
parentDiv.removeChild(document.getElementById('videoLoader')); //add in loadeddata  listener

Output of elements is as follows - 元素的输出如下-

<div id="parentDiv">
   <div id="videoLoader">..preloader..</div>
   <video>...</video>
</div>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM