HTML5<video>标签事件详解

首先,简书上有一个比较早的<video>详细说明,说的比较具体,先引用一下。

HTML5的Video标签的属性,方法和事件汇总

做个笔记:

标签

  • src :视频的属性
  • poster:视频封面,没有播放时显示的图片
  • preload:预加载
  • autoplay:自动播放
  • loop:循环播放
  • controls:浏览器自带的控制条
  • width:视频宽度
  • height:视频高度

属性的使用都可以参考上面贴出的博文。

事件

video事件

源自使用 HTML5 视频事件

从代码中感受功能使用:

<!DOCTYPE html >

<html >
  <head>
    <title>Video events example</title>
    <!-- Uncomment the following meta tag if you have issues rendering this page on an intranet or local site. -->    
    <!-- <meta http-equiv="X-UA-Compatible" content="IE=edge"/> -->    
    </head>
    <body >        

    <div>
        <label>Type or paste a video URL: <br/>
        <input type="text" id="videoFile" style="width: 300px;"  title="video file input field" value="http://ie.microsoft.com/testdrive/ieblog/2011/nov/pp4_blog_demo.mp4" />        
        <button id="loadVideo" title="Load video button" >Load</button>
        </label>
    </div>    
    <video id="Video1" controls style="border: 1px solid blue;" height="240" width="320" title="video element">      
         HTML5 Video is required for this example
    </video>
    
    <div id="buttonbar" style="display: none; font-size:larger;")>
        <button id="restart" title="Restart button">[]</button> 
        <button id="slower" title="Slower playback button">-</button>
        <button id="rew" title="Rewind button" >&lt;&lt;</button>
        <button id="play" title="Play button">&gt;</button>
        <button id="fwd" title="Forward button" >&gt;&gt;</button>
        <button id="faster" title="Faster playback button">+</button>
        <button id="mute" title="Mute button" ><img alt="Volume on button" src="vol2.png" /></button>     
        <br />
        <label>Reset playback rate: </label><button id="normal" title="Reset playback rate button">=</button>           
        <br />
        <label>  Volume: </label>
            <button id="volDn"  title="Volume down button">-</button>
            <button id="volUp"  title="Volume up button">+</button>
        <br />
        <div id="status" >Length(seconds): <span id="vLen"></span> <br />
        Current time:  <span id="curTime" title="Current time"></span><br />   Remaining time: <span id="vRemaining" title="Remaining time"></span></div>
    </div>   
    <br/>  

    <div title="Error message area" id="errorMsg" style="color:Red;"></div>  
    <div title="Event status area" >
      <label>oncanplaythrough: </label><span class="stats" id="cpt"></span><br />
      <label>onloadstart: </label><span class="stats"  id="ls"></span><br />
      <label>onprogress: </label><span class="stats"  id="pg"></span><br />
      <label>onloadeddata: </label><span class="stats" id="ld"></span><br />
      <label>onended: </label><span class="stats" id="ndd"></span><br />
      <label>onemptied: </label><span class="stats" id="mt"></span><br />
      <label>onstalled: </label><span class="stats" id="stall"></span><br />
      <label>onwaiting: </label><span class="stats" id="waiting"></span><br />
      <label>ondurationchange: </label><span class="stats" id="dc"></span><br />    
    </div>

    <script>
        var video = document.getElementById("Video1");
        var vLength;
        var pgFlag = ""; // used for progress tracking
        if (video.canPlayType) {   // tests that we have HTML5 video support

          //  video button helper functions
          //  play video
          function vidplay(evt) {
            if (video.src == "") {  // inital source load
              getVideo();
            }
            if (video.paused) {   // play the file, and display pause symbol
              video.play();
            } else {              // pause the file, and display play symbol  
              video.pause();
            }
          }
          
          //  load video file from input field
          function getVideo() {
            var fileURL = document.getElementById("videoFile").value; // get input field                    
            if (fileURL != "") {
              video.src = fileURL;
              video.load();  // if HTML source element is used
              document.getElementById("play").click();  // start play
            } else {
              errMessage("Enter a valid video URL");  // fail silently
            }
          }


          //  button helper functions 
          //  skip forward, backward, or restart
          function setTime(tValue) {
            //  if no video is loaded, this throws an exception 
            try {
              if (tValue == 0) {
                video.currentTime = tValue;
              }
              else {
                video.currentTime += tValue;
              }

            } catch (err) {
              // errMessage(err) // show exception
              errMessage("Video content might not be loaded");
            }
          }

          // change volume based on incoming value 
          function setVol(value) {
            var vol = video.volume;
            vol += value;
            //  test for range 0 - 1 to avoid exceptions
            if (vol >= 0 && vol <= 1) {
              // if valid value, use it
              video.volume = vol;
            } else {
              // otherwise substitute a 0 or 1
              video.volume = (vol < 0) ? 0 : 1;
            }
          }
          //  button events               
          //  Play
          document.getElementById("play").addEventListener("click", vidplay, false);
          //  Restart
          document.getElementById("restart").addEventListener("click", function () {
            setTime(0);
          }, false);
          //  Skip backward 10 seconds
          document.getElementById("rew").addEventListener("click", function () {
            setTime(-10);
          }, false);
          //  Skip forward 10 seconds
          document.getElementById("fwd").addEventListener("click", function () {
            setTime(10);
          }, false);
          //  set src == latest video file URL
          document.getElementById("loadVideo").addEventListener("click", getVideo, false);

          // volume buttons
          document.getElementById("volDn").addEventListener("click", function () {
            setVol(-.1); // down by 10%
          }, false);
          document.getElementById("volUp").addEventListener("click", function () {
            setVol(.1);  // up by 10%
          }, false);

          // playback speed buttons
          document.getElementById("slower").addEventListener("click", function () {
            video.playbackRate -= .25;
          }, false);
          document.getElementById("faster").addEventListener("click", function () {
            video.playbackRate += .25;
          }, false);
          document.getElementById("normal").addEventListener("click", function () {
            video.playbackRate = 1;
          }, false);
          document.getElementById("mute").addEventListener("click", function (evt) {
            if (video.muted) {
              video.muted = false;
            } else {
              video.muted = true;
            }
          }, false);

          //  any video error will fail with message 
          video.addEventListener("error", function (err) {
            errMessage(err);
          }, true);
          // content has loaded, display buttons and set up events
          video.addEventListener("canplay", function () {
            document.getElementById("buttonbar").style.display = "block";
          }, false);

          //  display video duration when available
          video.addEventListener("loadedmetadata", function () {
            vLength = video.duration.toFixed(1);
            document.getElementById("vLen").textContent = vLength; // global variable
          }, false);

          //  display the current and remaining times
          video.addEventListener("timeupdate", function () {
            //  Current time  
            var vTime = video.currentTime;
            document.getElementById("curTime").textContent = vTime.toFixed(1);
            document.getElementById("vRemaining").textContent = (vLength - vTime).toFixed(1);
          }, false);
          //  paused and playing events to control buttons
          video.addEventListener("pause", function () {
            document.getElementById("play").textContent = ">";
          }, false);

          video.addEventListener("playing", function () {
            document.getElementById("play").textContent = "||";
          }, false);

          video.addEventListener("volumechange", function () {
            if (video.muted) {
              // if muted, show mute image
              document.getElementById("mute").innerHTML = "<img alt='volume off button' src='mute2.png' />";
            } else {
              // if not muted, show not muted image
              document.getElementById("mute").innerHTML = "<img alt='volume on button' src='vol2.png' />";
            }
          }, false);
          //  Download and playback status events.
          video.addEventListener("loadstart", function () {
            document.getElementById("ls").textContent = "Started";
          }, false);
          video.addEventListener("loadeddata", function () {
            document.getElementById("ld").textContent = "Data was loaded";
          }, false);

          video.addEventListener("ended", function () {
            document.getElementById("ndd").textContent = "Playback ended";
          }, false);

          video.addEventListener("emptied", function () {
            document.getElementById("mt").textContent = "Video reset";
          }, false);

          video.addEventListener("stalled", function () {
            document.getElementById("stall").textContent = "Download was stalled";
          }, false);
          video.addEventListener("waiting", function () {
            document.getElementById("waiting").textContent = "Player waited for content";
          }, false);
          video.addEventListener("progress", function () {
            pgFlag += "+";
            if (pgFlag.length > 10) {
              pgFlag = "+";
            }
            document.getElementById("pg").textContent = pgFlag;

          }, false);
          video.addEventListener("durationchange", function () {
            document.getElementById("dc").textContent = "Duration has changed";
          }, false);
          video.addEventListener("canplaythrough", function () {
            document.getElementById("cpt").textContent = "Ready to play whole video";
          }, false);
        } else {
          errMessage("HTML5 Video is required for this example");
          // end of runtime
        }
        //  display an error message 
        function errMessage(msg) {
          // displays an error message for 5 seconds then clears it
          document.getElementById("errorMsg").textContent = msg;
          setTimeout("document.getElementById('errorMsg').textContent=''", 5000);
        }
    </script>

  </body>
</html>

当然,w3c上面也有比较详细的说明

HTML 5 视频/音频参考手册

重写或覆盖原有事件

博主项目遇到这样一个问题,在触发<video>controls属性/事件时,想要绑定另外一个function(){}这个貌似在教程中是不曾出现的,所以我摸索一下再贴出来。。待更~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容