2017-05-22 48 views
1

只是一個簡單的問題。TypeError:未能在'HTMLMediaElement'上執行'play':非法調用

我想爲變量指定一個HTMLMediaElement方法。

// html part 
<video id="player" ... /> 

// js part 
const video = document.querySelector('#player') 
const play = video.play 

video.play() // works! 

play() // error! 

Uncaught (in promise) TypeError: Failed to execute 'play' on 'HTMLMediaElement': Illegal invocation 

有人知道爲什麼會發生這個錯誤嗎?

+1

我想你需要將'this'綁定到'video'? ---是的,綁定的作品,'玩= play.bind(視頻)' – evolutionxbox

+0

這個問題感覺它是重複的...但我找不到一個愚蠢的目標。 – evolutionxbox

+0

如果你沒有找到以前的問題。您可以將答案發布到回答塊。 – WendellLiu

回答

2

HTMLMediaElement.play的原生DOM實現需要this綁定到HTMLMediaElement

video.play()因爲this的值綁定到videoplay()不起作用,因爲this值現在綁定到其他東西(也許window?)。

您可以調用它使用:

const video = document.querySelector('#video'); 
 
play = video.play; 
 

 
play.call(video);
<video id="video" src="http://vjs.zencdn.net/v/oceans.mp4" controls>

或 「保存以後」 使用綁定:

const video = document.querySelector('#video'); 
 
play = video.play.bind(video); 
 

 
play();
<video id="video" src="http://vjs.zencdn.net/v/oceans.mp4" controls>

+0

我會很感謝有人評論/編輯這個答案,當'play'被調用時'this'的值是什麼,而沒有綁定到'video'。 – evolutionxbox

相關問題