0

有一個HTML視頻標籤。我想知道它什麼時候開始播放:如何知道是什麼導致html視頻開始播放?

  • 是否是由autoplay引起的?
  • 是它造成通過調用JavaScript中play()
  • 是它造成的播放按鈕用戶點擊?

我想處理表演事件僅由用戶操作(在上述三個第三種情況)造成

我目前的解決方案:

function videoEventHandler(ev) { 
    var videoElem = ev.target; 
    if (!videoElem.controls) { 
     // no controls in video, means events can't be caused by user actions 
     return true; 
    } 

    switch (ev.type) { 
     case 'play': 
      if (videoElem.autoplay && !videoElem.hasPaused) { 
       // first play event in autoplay video, muse be caused by autoplay 
       return true; 
      } 
      // deal with play event caused by user actions 
      return true; 

     case 'pause': 
      ev.target.hasPaused = true; 
      // deal with pause event caused by user actions 
      return true; 
    } 
} 

問題:我的解決方案不能處理這些情況:

  • 它不知道,如果一個表演事件造成的JavaScript調用play()
  • 它不知道,如果一個暫停事件造成視頻到達終點

請注意:我不能添加一個標誌上play(),因爲它是所謂的網頁。網頁不是由我寫的,我無法改變它。 (我正在寫一個Chrome擴展)

誰能幫我在這?

這是一個非常具體的問題,它可能會產生混淆人。如果我的問題讓你感到困惑,請留下評論,我會盡力解釋清楚。讚賞。

+0

如果網站提供了與視頻元素分開的自己的播放按鈕,該怎麼辦?這基本上是用戶操作,即使視頻是由play()代碼啓動的。 – wOxxOm

+0

@wOxxOm你說得對。似乎對於每種情況都沒有完美的解決方案。我只想覆蓋大多數情況。 –

回答

0

我無法創建自己的視頻控件。如上所述,「我正在寫一個Chrome擴展,並且無法更改網頁」

我得到了最好的解決方案(不完全):

function videoEventHandler(ev) { 
    var videoElem = ev.target; 
    if (!videoElem.controls) { 
     // no controls in video, means events can't be caused by user actions 
     return true; 
    } 

    switch (ev.type) { 
     case 'play': 
      if (videoElem.autoplay && !videoElem.hasPaused) { 
       // first play event in autoplay video, muse be caused by autoplay 
       return true; 
      } 
      // deal with play event caused by user actions 
      return true; 

     case 'pause': 
      ev.target.hasPaused = true; 
      var self = this; 
      Util.setTimeout(function() { 
       // we don't record pause event followed by ended, because it is caused by video reaches end 
       if (!videoElem.hasEnded) { 
        // deal with pause event caused by user actions 
       } 
       videoElem.hasEnded = false; 
      }, 50); 
      return true; 
     case 'ended': 
      videoElem.hasEnded = true; 
      return true; 
    } 
} 

請注意:這個答案是不完美的。它不知道由autoplay引起的播放事件與通過JavaScript調用play()之間的區別。

0

當您從javaScript調用到play()時,只需在元素中將屬性設置爲true即可指定它由javascript啓動。在偵聽play事件時,可以檢查該變量以確定它是否從javascript播放。

之前調用play:

video.playedFromJavascript=true; 
video.play(); 

在玩聽衆:

if (videoElem.playedFromJavascript==true) { 
       // play event caused by javascript 
videoElem.playedFromJavascript=false; // resetting it to false once captured 
     } 

我們有ended事件時,視頻end.Use達到這個事件知道是否暫停事件引起的這引發視頻到達最後。

+0

對不起,我忘了說,網頁不是由我寫的,我無法改變它。 (我在寫一個Chrome擴展) –

1

你可以試着隱藏默認控件和創建自己的。這樣你只會得到關於用戶操作的信息。

據我所知,首發上場,由於自動播放標誌設置爲真正用戶按下播放按鈕和視頻之​​間沒有什麼區別。

正如HTML5 specification說:

自動播放屬性是一個布爾屬性。當存在時,用戶 代理將盡快自動開始回放媒體資源 ,因爲它可以在不停止的情況下進行回放。

請記住,如果連接速度慢,用戶可以按播放按鈕之前開始播放,由於自動播放標誌。

找出播放結束時,您可以使用ended事件或嘗試檢查回放(時間currentTime的屬性)的位置。

相關問題