2017-05-22 17 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'にバインドするのですか? --- Yep、binding works、 'play = play.bind(video)' – evolutionxbox

+0

この質問は重複しているように感じますが、私はデュープのターゲットを見つけることができません。前の質問が見つからない場合は – evolutionxbox

+0

。回答ブロックへの回答を投稿することができます。 – WendellLiu

答えて

2

HTMLMediaElement.playのネイティブDOM実装では、thisHTMLMediaElementにバインドする必要があります。

video.play()thisの値がvideoにバインドされているためです。 play()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

私は 'this'の値が' video'に束縛されずに 'play'が呼び出されたときのものであるというこの答えをコメントしたり編集したりする人に感謝します。 – evolutionxbox

関連する問題