使用jQuery选择HTML5视频对象

时间:2012-06-27 16:37:47

标签: jquery html5 html5-video

我在使用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')的对象?

7 个答案:

答案 0 :(得分:9)

我认为您在准备之前尝试与视频元素进行互动。

尝试这样的事情:

function loadStart(event)
{
    video.currentTime = 1.0;
}

function init()
{
    video.addEventListener('loadedmetadata', loadStart, false);
}
document.addEventListener("DOMContentLoaded", init, false);

来源:HTML5 Video - Chrome - Error settings currentTime

答案 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。也许这是一个快速而肮脏的解决方案,但它有效;)