我在使用jQuery获取HTML5视频标签时遇到问题。这是我的代码:
HTML code:
<video id="vid" height="400" width="550">
<source src="movie.mp4" type="video/mp4">
<source src="movie.ogv" type="video/ogg">
</video>
Javascript代码:
function playVid(){
console.log($('#vid'));
console.log($('#vid')[0]);
$('#vid')[0].currentTime=5;
$('#vid')[0].play()
}
$(document).ready(){
playVid();
}
代码在.currentTime
行中断,出现以下错误:
InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable
这是我无法弄清楚的一点 - 第一个console.log
显示了我期望的对象,在这个对象中是另一个名为0
的对象,它保存了所有HTML5视频属性和方法期待,包括.currentTime
。
但是,只要我执行$('#vid')[0]
的第二个日志,它就会显示视频代码的HTML代码,而不是我之后调用的0
对象。我得到console.log($('#vid')["0"])
和console.log($('#vid').get(0))
的完全相同的结果。
有没有办法在jQuery中工作的0
返回的对象中获取名为$('#vid')
的对象?
答案 0 :(得分:9)
我认为您在准备之前尝试与视频元素进行互动。
尝试这样的事情:
function loadStart(event)
{
video.currentTime = 1.0;
}
function init()
{
video.addEventListener('loadedmetadata', loadStart, false);
}
document.addEventListener("DOMContentLoaded", init, false);
答案 1 :(得分:6)
我遇到了完全相同的问题(有音频)。我不相信接受的答案会解决或解释问题,主要是因为它不是一个jquery解决方案。
奇怪的是我可以获取 currentTime属性,我甚至可以确保在尝试设置currentTime之前声音已经播放并且发生了相同的错误,所以我不相信这与媒体“准备好”有关。
var a = $("#myaudio").get(0); // a html5 audio element
console.log(a) // dumps the object reference in the console
console.log(a.currentTime); // works fine, logs correct value
a.currentTime = 100 // fails with an InvalidStateError
解决方法是使用setTimeout
setTimeout(function(){
a.currentTime = 0;
},1);
......但我想明白为什么会失败!
答案 2 :(得分:6)
var a_video = $('#video_id');
a_video.on('loadeddata', function() {
if(a_video.readyState != 0) {
a_video[0].currentTime = 100;
} else {
a_video.on('loadedmetadata', function() {
a_video[0].currentTime = 100;
});
}
});
答案 3 :(得分:3)
function playVid(){
$('#vid').get(0).currentTime=5;
$('#vid').get(0).play()
}
$(window).load(function(){
playVid();
});
Here是一个jsfiddle例子。
答案 4 :(得分:2)
我在音频方面遇到了同样的问题。这是一场灾难:)。您必须先播放音频,然后才能设置currentTime。我找不到别的办法了。这是一个很好的参考线程:https://github.com/johndyer/mediaelement/issues/243
播放元素,然后为将设置当前时间的“播放”事件设置事件侦听器。我不得不阻止无限循环,所以我在方法之外设置了'loadPlayed'。它可能不是很优雅,但它是有效的,所以我保留它。
audioplayer.src = source;
audioplayer.play();
audioplayer.addEventListener('playing', function () {
if (loadPlayed == false)
{
audioplayer.currentTime = Time;
audioplayer.play();
loadPlayed = true;
}
else {
audioplayer.removeEventListener('playing', this);
}
});
答案 5 :(得分:1)
您还可以使用try - catch
来避免此问题:
$(document).ready(function() {
var $video = $('#vid'),
video = $video[0];
function playVid() {
video.currentTime = 5;
video.play();
}
try {
playVid();
} catch(error) {
$video.on('loadedmetadata', playVid);
video.load();
}
});
答案 6 :(得分:1)
我遇到了类似的问题,但无法使用事件监听器,因为我使用时间码并单击函数来设置当前时间。但我也找到了一个有效的解决方案。每当我点击一个按钮(每个按钮都有不同的时间变量)时,这就是点击功能中的代码:
$("#movie").get(0).play();
setTimeout(function () {
$("#movie").get(0).currentTime = my_time_variable;
}, 500);
因此,在触发函数之前等待0.5秒,将不再发生InvalidStateError。也许这是一个快速而肮脏的解决方案,但它有效;)