前提
html、javascriptで動画プレイヤーを作っています。
実際はnode.jsを使用したYouTubeダウンローラーですが、それはここではなしとします。
実現したいこと
タイトルの通り、<video>
の再生がタブの変更などで非アクティブ化した際、
再生が止まってしまうのを解決したいです。
例えば、動画の音だけでも聞きながらほかの作業をしようとした際に、動画が停止してしまいます
まだ製作段階なので、とりあえずボタンとか雑ですがお許しを
divは好きです
該当のソースコード
html
1<html lang="ja"> 2 3<head> 4 <title>YouTube Player</title> 5 <script src="./playwith/index.js"></script> 6 <link type="text/css" rel="stylesheet" href="./playwith/stylesheet.css"> 7 <link type="text/css" rel="stylesheet" href="../publicstylesheet.css"> 8</head> 9 10<body> 11 <div class="leftAria"> 12 <div class="playerWindow"> 13 <video id="video" src="" poster="" preload="metadata"></video> 14 <div class="playerPopup"> 15 <div class="playerHeader"></div> 16 <div class="playerFooter"> 17 <div id="seekbar-wrap"> 18 <div id="seek-point"></div> 19 <div id="seekbar-out"> 20 <div id="seekbar-load"></div> 21 <div id="seekbar-in"></div> 22 </div> 23 </div> 24 </div> 25 </div> 26 </div> 27 </div> 28 <div class="rightAria"> 29 <input type="button" value="再生" onclick="video.play()"> 30 <input type="button" value="一時停止" onclick="video.pause()"> 31 </div> 32</body> 33 34</html>
./playwith/index.js
javascript
1addEventListener("load", e => { 2 const 3 video = document.getElementById("video"), 4 seekbarDrag = document.getElementById("seekbar-wrap"), 5 seekbarLoad = document.getElementById("seekbar-load"), 6 seekpoint = document.getElementById("seek-point"), 7 seekbarIn = document.getElementById("seekbar-in"), 8 audio = new Audio() 9 document.body.appendChild(audio) 10 video.addEventListener("timeupdate", e => { 11 let bufferNo 12 seekbarIn.style.transform = "scaleX(" + (video.currentTime / video.duration) + ")"; 13 seekpoint.style.left = (video.currentTime / video.duration) 14 for (let i = (video.buffered.length); bufferNo == undefined && video.buffered.length != 0 && i != 0; i--) { 15 if (video.buffered.start(i - 1) < video.currentTime) { 16 bufferNo = video.buffered.end(i - 1); 17 } 18 } 19 seekbarLoad.style.transform = "scaleX(" + (bufferNo / video.duration) + ")"; 20 }) 21 video.addEventListener("play", e => { 22 audio.currentTime = video.currentTime 23 audio.play() 24 }) 25 video.addEventListener("pause", e => { 26 audio.pause() 27 }) 28 seekbarDrag.addEventListener("click", e => { 29 e.preventDefault() 30 let percent = (e.pageX - (seekbarDrag.getBoundingClientRect().left + window.pageXOffset)) / seekbarDrag.clientWidth 31 video.currentTime = video.duration * percent 32 audio.currentTime = video.currentTime 33 }) 34 seekbarDrag.addEventListener("mousemove", e => { 35 e.preventDefault() 36 if (document.getElementsByClassName("drag")[0]) { 37 let percent = (e.pageX - (seekbarDrag.getBoundingClientRect().left + window.pageXOffset)) / seekbarDrag.clientWidth 38 video.currentTime = video.duration * percent 39 audio.currentTime = video.currentTime 40 } 41 }) 42 seekbarDrag.addEventListener("mousedown", e => seekbarDrag.classList.add("drag")) 43 seekbarDrag.addEventListener("mouseup", e => { 44 seekbarDrag.classList.remove("drag") 45 }) 46 const params = new Proxy(new URLSearchParams(window.location.search), { get: (searchParams, prop) => searchParams.get(prop) }) 47 const videoId = params.v 48 video.src = "../../ytvideo/" + videoId 49 audio.src = "../../ytaudio/" + videoId 50})
試したこと
js
1addEventListener("focus", e => e.preventDefault()) 2addEventListener("focusin", e => e.preventDefault()) 3addEventListener("focusout", e => e.preventDefault())
これでどうにか食い止められるかやってみましたが、何か変化はなかったです...
補足情報(FW/ツールのバージョンなど)
環境: Edge, Chrome

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。