使用 HTML5 視頻事件

原文url: 使用 HTML5 視頻事件

由這篇文章關(guān)聯(lián)出來的微軟web開發(fā)

HTML5 視頻事件提供改進(jìn)和提高網(wǎng)頁效率的方法忽妒。

  • 為什么要使用事件负乡?
  • 我的網(wǎng)頁準(zhǔn)備好了么?
  • 我處于什么位置晒旅?
  • 現(xiàn)在該按鈕可執(zhí)行哪些操作?
  • 該操作已完成?
  • 相關(guān)主題

** 為什么要使用事件? **
HTML5 視頻對(duì)象提供了很多事件背伴,這些事件可以幫助簡(jiǎn)化和增強(qiáng)網(wǎng)頁的內(nèi)容。 在此處將看到使用事件檢查內(nèi)容是否可用峰髓、視頻播放狀態(tài)以及如何在視頻中監(jiān)視當(dāng)前播放位置的示例傻寂。

** 我的網(wǎng)頁準(zhǔn)備好了么?**
對(duì)于使用視頻的網(wǎng)頁儿普,你會(huì)對(duì)兩種級(jí)別的“準(zhǔn)備”感興趣崎逃;當(dāng)加載頁面元素時(shí)以及當(dāng)可以播放內(nèi)容時(shí)。
HTML5 視頻頁面中最常用的第一個(gè)任務(wù)就是查看瀏覽器是否支持視頻眉孩。完成此操作的方法通常為:查看是否在頁面上創(chuàng)建了視頻元素个绍,以及腳本所需的屬性是否可用勒葱。如果已在文檔對(duì)象模型 (DOM) 中加載或創(chuàng)建了元素,則腳本只能檢查元素巴柿。檢查網(wǎng)頁元素是否完成加載的最好方法是在 document 對(duì)象上使用 DOMContentLoaded 事件凛虽。當(dāng)頁面元素完成加載并且基本 DOM 可用時(shí)引發(fā)此事件。 此示例為調(diào)用網(wǎng)頁的 "init()" 函數(shù)的 DOMContentLoaded 創(chuàng)建處理程序广恢。

*HTML *

//  When the HTML elements load, call init()
  document.addEventListener("DOMContentLoaded", init, false);
 
  //  Rotate the video by 30degrees when image is clicked
  function init() {
    var video = document.getElementById("theVideo");
    if (video) {
      var rotateVal = 0;       //  Global variable to hold current rotation value
      document.getElementById("rotateVideo").addEventListener("click", function () {
        rotateVal = (rotateVal += 30) % 360;  // Calculate the next value, but keep between 0 and 360
        var temp = "rotate(" + rotateVal + "deg)"; // Create a style string
        document.getElementById("theVideo").style.msTransform = temp;  // Set the style
      }, false);
    }
  }

該示例的 "init()" 函數(shù)封裝了頁面腳本部分的所有功能凯旋。

另一種方法是按照本主題的示例中的操作放置 <script> 部分。將加載 HTML 部分钉迷,然后加載腳本部分至非。這將確保所有的 HTML 元素均已加載。如果你在 HTML 部分加載任何內(nèi)容糠聪,你可能需要使用 onload 事件來檢查其完整性荒椭,因?yàn)橄噍^于元素,媒體所需的加載時(shí)間通常更長(zhǎng)舰蟆。

腳本部分設(shè)置多個(gè)全局變量趣惠,即 "video"、"vLength" 和 "pgFlag"身害。這些變量提供視頻對(duì)象味悄、當(dāng)前已加載的視頻的長(zhǎng)度(之后用于計(jì)算)以及用于跟蹤進(jìn)度的標(biāo)志。
*HTML *

var video = document.getElementById("Video1");
var vLength;
var pgFlag = ""; // used for progress tracking

然后塌鸯,測(cè)試視頻變量以查看 canPlayType 屬性是否可用侍瑟。如果可用,則支持 HTML5 video 元素并且執(zhí)行所有其他代碼界赔。如果不支持視頻丢习,則語句 (video.canPlayType) 將返回 False 并顯示一條消息。確認(rèn)支持視頻后淮悼,通過顯示樣式啟用輸入字段。
*HTML *

if (video.canPlayType) {   // tests that we have HTML5 video support

此時(shí)揽思,可以在輸入字段中鍵入文件并進(jìn)行加載袜腥。根據(jù)視頻文件所在的位置,如果任何網(wǎng)絡(luò)或服務(wù)器速度緩慢钉汗,則可能會(huì)在加載其余部分網(wǎng)頁時(shí)阻止準(zhǔn)備視頻羹令。以下示例使用 oncanplay 事件通知何時(shí)視頻加載內(nèi)容已足夠用于開始播放。引發(fā) oncanplay 事件時(shí)损痰,處理程序顯示播放控件以通知它已準(zhǔn)備就緒可以開始播放了福侈。
*HTML *

// content has loaded, display buttons and set up events
video.addEventListener("canplay", function () {
  document.getElementById("buttonbar").style.display = "block";
}, false);

視頻加載到視頻對(duì)象中時(shí),要加載的首要內(nèi)容之一就是元數(shù)據(jù)卢未,它包含有關(guān)視頻的信息肪凛。以下示例使用 onloadedmetadata 事件來確定視頻有多長(zhǎng)堰汉。 當(dāng) video 對(duì)象獲取有關(guān)內(nèi)容的足夠信息以了解持續(xù)時(shí)間后,引發(fā) onloadedmetadata 事件伟墙。
*HTML *

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

** 我處于什么位置翘鸭?**
上一示例顯示了如何在加載視頻后獲取視頻的持續(xù)時(shí)間或長(zhǎng)度。視頻開始播放后戳葵,可以使用 ontimeupdate 事件來獲取視頻中的當(dāng)前位置就乓。當(dāng) currentTime 屬性發(fā)生更改時(shí),引發(fā) ontimeupdate 事件拱烁。在事件處理程序中生蚁,從視頻對(duì)象中檢索 currentTime 的值并進(jìn)行顯示。currentTime 屬性是浮點(diǎn)型變量戏自,該變量可以從 12 位中獲取小數(shù)位置守伸。但是,出于性能方面的考慮浦妄,在 Windows Internet Explorer 中一秒內(nèi)僅引發(fā)該事件四次尼摹。若要在示例中顯示,則需要使用 "toFixed()" 方法將 currentTime 取舍為一位剂娄。運(yùn)行視頻時(shí)蠢涝,會(huì)更新和顯示當(dāng)前時(shí)間。
*HTML *

//  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);

該示例還通過從持續(xù)時(shí)間中減去當(dāng)前時(shí)間來報(bào)告剩余時(shí)間阅懦。

** 現(xiàn)在該按鈕可執(zhí)行哪些操作和二?**
在視頻播放器控件中的一個(gè)常見趨勢(shì)是在兩個(gè)狀態(tài)之間切換按鈕,如“播放”****和“暫投ィ”****或者“聲音”****和“靜音”****惯吕。使用 JavaScript 控制 HTML5 視頻播放器中的示例在按鈕處理程序中實(shí)現(xiàn)該操作。例如怕午,在單擊“播放”****按鈕時(shí)废登,單擊處理程序檢查 paused 屬性并播放或暫停視頻播放。播放視頻時(shí)郁惜,它還會(huì)將該按鈕切換為暫停文本堡距,暫停視頻時(shí)將該按鈕切換為播放文本。大多數(shù)時(shí)間它都是這樣工作的兆蕉,但如果視頻元素啟用了 controls羽戒,則兩個(gè)按鈕設(shè)置無法同步。此示例顯示在播放按鈕處理程序中暫停屬性的用法虎韵。
*HTML *

//  play video
                function vidplay(evt) {
                    if (video.src == "") {  // inital source load
                        getVideo();
                    }
                    button = evt.target; //  get the button id to swap the text based on the state                                    
                    if (video.paused) {   // play the file, and display pause symbol
                        video.play();
                        button.textContent = "||";
                    } else {              // pause the file, and display play symbol  
                        video.pause();
                        button.textContent = ">";
                    }
                }

最好是使用 onpauseonplaying 事件保持按鈕同步易稠。與在單擊按鈕時(shí)只檢查暫停屬性的上一示例不同,下一示例在視頻播放狀態(tài)更改時(shí)切換按鈕包蓝,而不管按鈕如何切換驶社。
*HTML *

//  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);

在此頁面的結(jié)尾處嘗試該示例并注意外部按鈕和視頻對(duì)象中的內(nèi)置控件如何保持同步企量。

可以對(duì) onvolumechange 事件使用相同的技術(shù)以控制靜音按鈕上的圖形。由于沒有單獨(dú)的靜音和音量事件衬吆,因此下一示例使用 onvolumechange 來處理兩個(gè)狀態(tài)梁钾。
*HTML *

video.addEventListener("volumechange", function () {
   if (video.muted) {
       // if muted, show mute image 
       document.getElementById("mute").innerHTML = "[站外圖片上傳中……(3)]";
   } else {
       // if not muted, show not muted image 
      document.getElementById("mute").innerHTML = "[站外圖片上傳中……(4)]"; 
   }
}, false);

在此示例中,引發(fā) onvolumechange 事件時(shí)逊抡,"if" 語句測(cè)試 muted 屬性姆泻。如果 video 對(duì)象的聲道為靜音,則顯示靜音圖形冒嫡;否則顯示聲音圖形拇勃。隨著圖形更改,alt 文本也會(huì)更改以提供精確描述作為輔助功能孝凌。
注意 在用戶將其鼠標(biāo)懸停在元素上方時(shí)方咆,所有按鈕、輸入元素以及視頻元素都使用 title 特性來提供工具提示蟀架。這種做法還會(huì)為屏幕讀取器設(shè)備提供標(biāo)識(shí)文本瓣赂。

事件 說明
oncanplaythrough 在不需要進(jìn)一步緩沖就可以播放直至文件結(jié)束時(shí)引發(fā)。
onloadstart 在 Internet Explorer 開始查找媒體數(shù)據(jù)時(shí)引發(fā)片拍。在從站點(diǎn)請(qǐng)求視頻(或音頻)資源時(shí)發(fā)生此事件煌集,并且每個(gè)請(qǐng)求只發(fā)生一次。
onloadeddata 在當(dāng)前播放位置加載媒體數(shù)據(jù)時(shí)引發(fā)捌省。視頻可以開始播放苫纤。
onended 在播放結(jié)束時(shí)引發(fā)。
onemptied 在視頻對(duì)象重置為其初始狀態(tài)時(shí)引發(fā)纲缓。
onstalled 在下載被中斷三秒以上時(shí)引發(fā)卷拘。這可以指示網(wǎng)絡(luò)問題。
onwaiting 在播放由于視頻的下一幀不可用(可能需要緩沖)而停止時(shí)引發(fā)祝高。
onprogress 引發(fā)此事件以指示正在下載媒體內(nèi)容栗弟。下載完成后停止引發(fā)。
ondurationchange onloadstart 之后和 onloadedmetadata 之前立即引發(fā)褂策。

** 該操作已完成横腿?**
HTML5 視頻播放器需要緩沖用于播放的內(nèi)容。如果視頻內(nèi)容較大斤寂,在頁面可能需要管理播放并發(fā)送消息以為用戶提供更好的體驗(yàn)。例如揪惦,如果下載需要的時(shí)間較長(zhǎng)遍搞,則可以使用事件來通知用戶出現(xiàn)的問題,而不只是在沒有任何說明的情況下停止視頻器腋∠常可以使用 onstalled钩杰、onwaitingonended 來確定視頻中斷時(shí)的操作。 下表描述可以用來管理播放和用戶期望的事件诊县。

事件 說明
oncanplaythrough 在不需要進(jìn)一步緩沖就可以播放直至文件結(jié)束時(shí)引發(fā)讲弄。
onloadstart 在 Internet Explorer 開始查找媒體數(shù)據(jù)時(shí)引發(fā)。在從站點(diǎn)請(qǐng)求視頻(或音頻)資源時(shí)發(fā)生此事件依痊,并且每個(gè)請(qǐng)求只發(fā)生一次避除。
onloadeddata 在當(dāng)前播放位置加載媒體數(shù)據(jù)時(shí)引發(fā)。視頻可以開始播放胸嘁。
onended 在播放結(jié)束時(shí)引發(fā)瓶摆。
onemptied 在視頻對(duì)象重置為其初始狀態(tài)時(shí)引發(fā)。
onstalled 在下載被中斷三秒以上時(shí)引發(fā)性宏。這可以指示網(wǎng)絡(luò)問題群井。
onwaiting 在播放由于視頻的下一幀不可用(可能需要緩沖)而停止時(shí)引發(fā)。
onprogress 引發(fā)此事件以指示正在下載媒體內(nèi)容毫胜。下載完成后停止引發(fā)书斜。
ondurationchange onloadstart 之后和 onloadedmetadata 之前立即引發(fā)。

此代碼示例是本主題中所示示例的完整代碼酵使,它包含顯示適用于此處提到的下載和緩沖的事件的內(nèi)容荐吉。
注意 此示例使用圖像來表示聲音打開

和聲音關(guān)閉

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凝化,隨后出現(xiàn)的幾起案子稍坯,更是在濱河造成了極大的恐慌,老刑警劉巖搓劫,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞧哟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡枪向,警方通過查閱死者的電腦和手機(jī)勤揩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秘蛔,“玉大人陨亡,你說我怎么就攤上這事∩钤保” “怎么了负蠕?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)倦畅。 經(jīng)常有香客問我遮糖,道長(zhǎng),這世上最難降的妖魔是什么叠赐? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任欲账,我火速辦了婚禮屡江,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赛不。我一直安慰自己惩嘉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布踢故。 她就那樣靜靜地躺著文黎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畴椰。 梳的紋絲不亂的頭發(fā)上臊诊,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音斜脂,去河邊找鬼抓艳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛帚戳,可吹牛的內(nèi)容都是我干的玷或。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼片任,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼偏友!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起对供,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤位他,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后产场,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹅髓,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年京景,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窿冯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡确徙,死狀恐怖醒串,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鄙皇,我是刑警寧澤芜赌,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站伴逸,受9級(jí)特大地震影響较鼓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜违柏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一博烂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漱竖,春花似錦禽篱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至万矾,卻和暖如春悼吱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背良狈。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工后添, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人薪丁。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓遇西,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親严嗜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子粱檀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容