<视频>和加载的元数据事件
<video> and onloadedmetadata-event
我想在JavaScript中使用HTML5视频元素的维度。video
-标签本身没有设置任何尺寸,所以我希望它能缩放到视频的大小(确实如此)。我的标记如下:
<video id="viddy" autoplay>
<source src="myvideo.mp4" type='video/mp4; codecs="avc1.42E01E"' />
</video>
当我只使用jQuery获取元素的height()
和/或width()
时,我将获得默认值300,因为它不会等待视频加载。所以我在网上(这里和这里)发现我应该在等待onloadedmetadata
-事件。所以我试图在我的JS中做以下事情:
var video = document.getElementById('viddy');
video.onloadedmetadata = function(e){
var dimensions = [video.videoWidth, video.videoHeight];
alert(dimensions);
}
然而,这个活动永远不会启动(尽管视频会加载并播放),我永远不会得到我的尺寸。jQuery-bind('load',
和我能想到的其他所有方法都是如此。知道吗?谢谢
将代码放入HTML头末尾的function
中(例如称为init
),并将其绑定到DOMContentLoaded
事件:
function init() {
var video = document.getElementById('viddy');
video.onloadedmetadata = function(e){
var dimensions = [video.videoWidth, video.videoHeight];
alert(dimensions);
}
}
document.addEventListener("DOMContentLoaded", init, false);
<video id="viddy" autoplay>
<source src="http://media.w3.org/2010/05/sintel/trailer.webm" type='video/webm' />
</video>
对于Chrome
您应该更改将侦听器添加到:
video.addEventListener('loadedmetadata', function(e){
function init() {
var video = document.getElementById('viddy');
video.addEventListener('loadedmetadata', function(e){
var dimensions = [video.videoWidth, video.videoHeight];
alert(dimensions);
});
}
document.addEventListener("DOMContentLoaded", init, false);
<video id="viddy" autoplay>
<source src="http://media.w3.org/2010/05/sintel/trailer.webm" type='video/webm' />
</video>
使用jQuery
$(document).ready(function() {
$('#viddy').on('loadedmetadata', function() {
var dimensions = [this.videoWidth, this.videoHeight];
alert(dimensions);
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<video id="viddy" autoplay>
<source src="http://media.w3.org/2010/05/sintel/trailer.webm" type='video/webm' />
</video>
TL;DR在DOMContentLoaded
之后添加loadedmetadata
侦听器并不能保证在loadedmetadata
事件触发之前添加侦听器,但是,将事件侦听器添加到使用src
的视频元素之前创建的元素(例如document
)中,并处于捕获阶段,或者将事件侦听程序作为属性内联添加到视频元素中。
视频文件的维度将与视频文件元数据一起加载。因此,您需要等待loadedmetadata
事件被触发,然后您将能够从html视频元素的videoWidth
和videoHeight
属性中获取维度,在那里它们将被设置并准备好,这些都是正确的。
注意DOMContentLoaded
:在dom内容加载事件之后添加事件侦听器,只会首先保证html元素的存在,从而能够在上添加事件侦听程序。这是正确的方法,这里不是问题所在。相反,这正是遇到问题的原因:在添加事件侦听器之前,元素的存在(具有src
属性以加载数据),这在某种程度上是事件侦听器容易错过它应该捕获和处理的事件的原因。
当您将此事件侦听器添加到视频元素时,事件可能已经发生、传播和结束,因为您在使用其src
属性创建的视频元素之后添加了事件处理程序。它将开始加载视频,从而加载视频元数据。如果速度足够慢,那么在加载视频元数据后loadedmetadata
事件结束之前,您的代码将有机会添加到视频元素中。
-
您需要在视频之前注册事件处理程序元素开始加载其视频文件。这里是
src
属性,因此您需要在添加CCD_ 22属性。您可以在视频元素本身上添加内联事件属性:
<video src="some-video-url" onloadedmetadata="somehandler">
。在这里不确定处理程序是否也应该内联定义,或者只是参考作品。 -
您可以在使用
src
属性创建视频元素之前添加事件侦听器。这意味着您需要将其添加到另一个祖先html元素中,该元素是在使用src
属性创建视频元素之前创建的。此外,该事件不是气泡,而是捕获。所以,您必须将它添加到事件的捕获阶段,并添加到祖先元素中,例如document
。
document.addEventListener("loadedmetadata", function(e){
// if necesssary one can add custom logic here for example to check if the event target is the element we are listening the event for with event.target
var video = e.target;
var dimensions = [video.videoWidth, video.videoHeight];
alert(dimensions);
}, true);
<video id="viddy" autoplay>
<source src="http://media.w3.org/2010/05/sintel/trailer.webm" type='video/webm' />
</video>
- 访问Twilio短信元数据
- Firebase-返回用户uid并将用户元数据值设置为不同的节点
- Chart.js2.X中的条形值-数据集元数据未定义
- javascript绑定另一个select2输入字段rails的select2 inputonchange事件的数据
- E4X中是否有一种方法可以将基元数据类型的XMLList转换为类似于Array.join()的Array
- 获取javascript中的元数据属性
- 从 Google 云端硬盘请求文件元数据时缺少“downloadUrl”参数
- 如何在上传前在浏览器中去除图像元数据(javascript)
- Amcharts仅显示有关调整大小事件的数据
- chart.js v2:如何添加元数据的工具提示
- 如何从广播流中获取mp3元数据(无icecast,无shoutcast)
- 试图使一个事件依赖于另一个事件,并使用jquery自定义事件传递数据
- IE8:触发“加载元数据”事件
- Firefox 加载元数据事件
- 不冒泡的 JS 事件(进度、加载的元数据等)
- 未定义的 JWPlayer 元数据事件
- <视频>和加载的元数据事件
- swf加载元数据事件
- 如何在select_node事件上为jtree添加元数据
- Google Drive文档上的事件和元数据