2014-04-03 68 views
0

我有一個video元素,我用javascript動態控制。它一直在努力工作。今天我注意到一些奇怪的事Chrome5中的HTML5/Javascript視頻事件行爲33.0.1750.154

我附加了以下事件偵聽器。

function registerListeners(listen) { 
    listen.addEventListener('canplaythrough', canStartPlayback); 
    listen.addEventListener('ended', onFinish); 
    listen.addEventListener('loadeddata', onLoadComplete); 
    listen.addEventListener('playing', onPlay); 
    listen.addEventListener('error', mediaError); 
} 

而對於canStartPlaybackonFinish代碼和onPlay如下。

function canStartPlayback() { 
    if (!playing) { 
     playing = true; 
     $('.module-content-video-loader').stopSpin(); 
     $('.module-content-video-loader').hide(); 
     media.play(); 
    } 
} 

function onFinish() { 
    if (playing) { 
     playing = false; 
     media.pause(); 
     media.currentTime = 0.0; 
    } 
} 

function onPlay() { 
    playing = true; 
    if (!pending) { 
     $('#skip').show(); 
    } 
} 

現在,我目前發現onFinish完成後,我立刻看到canStartPlayback被再次發射。

這是canplaythrough從Mozilla的

canplaythrough說明當就緒狀態變化到CAN_PLAY_THROUGH,表明整個媒體就能無中斷地播放,假定的下載速率至少在目前的水平仍然發送。 注意:手動設置currentTime最終會在firefox中觸發一個canplaythrough事件。其他瀏覽器可能不會觸發此事件。

我在印象之下,並且已經看到canplaythrough只發射一次。最近有沒有鉻改變這一點,並有其他人發現這種情況正在發生?

回答

1

canplaythrough事件(如canplay)隨着readyState屬性更改而觸發。這些事件和屬性反映了瀏覽器能夠從當前位置播放多少視頻。因此,如果您尋找一個未緩衝的新位置,瀏覽器將無法再從當前位置播放,因此readyState必須下降到HAVE_METADATA。一旦新的部分被加載,readyState最終會回到HAVE_ENOUGH_DATA,事件將再次激發

從2009年開始this fix起,Chrome模仿Firefox的行爲,即每次搜索都會將readyState降爲HAVE_METADATA,即使視頻已完全緩衝。據推測,這是因爲即使視頻是從網絡加載的,仍然需要時間將該部分加載回內存並顯示當前幀。

如果你需要確保你的事件僅被處理一次,就可以保持更詳細的狀態,也可以刪除監聽器運行後的第一時間,像這樣:

media.removeEventListener('canplaythrough', canStartPlayback); 

下面是一個例子會引發一系列事件並將它們記錄到控制檯,以便您在尋找時可以看到它們: http://jsbin.com/buparoye/1/edit