动态创建 HTML5 视频元素,而不显示在页面中

Posted

技术标签:

【中文标题】动态创建 HTML5 视频元素,而不显示在页面中【英文标题】:Dynamically create a HTML5 video element without it being shown in the page 【发布时间】:2013-10-15 15:05:21 【问题描述】:

是否可以动态创建 html5 视频元素,以便我可以通过 document.getElementById 或名称等 API 访问该元素,但它可能不会显示在网页中。

类似div.hide() 或那个方向的东西?

【问题讨论】:

如果你已经创建了元素,为什么还要尝试从文档中获取对它的引用?只需保留创建时获得的参考即可。 当然。这是可能的。谷歌一下,你会找到答案。 使用 css 通过display:nonevisibility:hidden 或者如果使用jquery 的hide() 方法来隐藏它。然后根据您的需要显示它。 最好的方法是我也实现了嵌入视频并在一次执行中将其删除。因此我们可以操纵 dom,它也不会在网页中显示。 【参考方案1】:

你可以试试

var video = document.createElement('video');

video.src = 'urlToVideo.ogg';
video.autoplay = true;

你也可以在设置源之前使用canPlayType方法检查浏览器是否支持你要使用的视频格式

if (video.canPlayType('video/ogg').length > 0) 
    /* set some video source */

该方法根据浏览器返回maybeperhaps。如果字符串为空则表示无法播放。

您现在可以通过 API 使用 video。只需将其存储在全球范围内。您可以稍后将其插入 DOM。希望这会有所帮助。

【讨论】:

当我将文件拖放到网页上时,我需要动态创建一个视频元素并将其附加到特定的 DIV。在示例代码中,urlToVideo.ogg 大概是服务器端的相对 url。我所拥有的只是文件中的本地 URL。 使用 video.autoplay = true 不是自动播放【参考方案2】:

当然,您可以只使用 JS 来创建所有内容。您无需在 html 正文中预先创建任何内容。

这是在 JS 中创建视频元素的简单方法:

var videlem = document.createElement("video");
/// ... some setup like poster image, size, position etc. goes here...
/// now, add sources:
var sourceMP4 = document.createElement("source"); 
sourceMP4.type = "video/mp4";
sourceMP4.src = "path-to-video-file.mp4";
videlem.appendChild(sourceMP4);
//// same approach add ogg/ogv and webm sources

在此之前,您应该检查浏览器是否支持视频元素,如果支持,可以播放哪些文件格式。你可以这样做:

var supportsVideoElement = !!document.createElement('video').canPlayType;

然后,如果支持视频元素,测试可以播放哪些视频格式:

var temp = document.createElement('video');
var canPlay_MP4 = temp.canPlayType('video/mp4; codecs="avc1.42E01E,mp4a.40.2"');
var canPlay_OGV = temp.canPlayType('video/ogg; codecs="theora,vorbis"');
var canPlay_WEMB = temp.canPlayType('video/webm; codecs="vp8,vorbis"');

在此之后,您可以仅使用 JS 将视频元素添加到您的页面,并设置适当的视频源。服务器端的 .htaccess 可能存在问题,您需要在其中添加行:

AddType video/ogg .ogv
AddType video/ogg .ogg
AddType video/mp4 .mp4
AddType video/webm .webm

这可能不需要,具体取决于您的服务器的设置方式,但如果您在播放服务器上的视频时遇到问题,但它们可以正常播放,例如。 localhost 在您的开发机器上,这可以解决问题。上面几行的.htaccess 应该放在服务器端视频文件所在的文件夹中。

现在,为了让这个元素在 getElementById(...) 中可用,你只需要在创建它时设置它的 id:

var videlem = document.createElement("video");
videlem.id = "xxxxxx";

现在您可以稍后使用:

var videlem = document.getElementById("xxxxxx");

但是,正如已经有人评论的那样,如果您已经创建了元素并且有指向它的变量,则不需要这样做......直接使用它。

希望这会有所帮助:-)

【讨论】:

我知道我们可以创建各种元素,例如视频/iframe,但我认为我们必须在同一个周期中删除元素,这样它就不会出现在 DOM 中。所以我们必须removeElement 在创建 else 之后也会显示在 DOM 中。 您创建一个临时视频对象并且不对您将在 DOM 中使用的视频调用 canPlayType 的任何特殊原因? @Micros 你指的sn-p是如果你只是想测试可以播放什么格式,所以以后你制作视频的时候,不需要把所有的源都放上去,只要放一个可以播放。它还可以帮助您确定是否支持视频标签,但由于某种原因,可用的编解码器无法播放。在我看来,测试应该只进行一次(例如,在加载文档时),而不是每次将视频添加到文档时。【参考方案3】:

实现这一点的更新(也是最简单的)方法(因为谷歌搜索在这里领先):

var x = document.createElement("VIDEO");

if (x.canPlayType("video/mp4")) 
    x.setAttribute("src","movie.mp4");
 else 
    x.setAttribute("src","movie.ogg");


x.setAttribute("width", "320");
x.setAttribute("height", "240");
x.setAttribute("controls", "controls");
document.body.appendChild(x);

【讨论】:

以上是关于动态创建 HTML5 视频元素,而不显示在页面中的主要内容,如果未能解决你的问题,请参考以下文章

iPad HTML5 视频元素不显示海报

ReactJS画布drawImage不显示html5视频元素

使 HTML5 视频适合父元素大小

使用 JavaScript 包装 HTML5 视频元素会破坏 iOS 中的视频播放器

如何使用 jquery 将动态创建的 img 元素加载到 HTML5 画布中

为啥 Internet Explorer 对 HTML5 视频显示“错误:视频播放已中止”?