javascript 播放新视频时停止所有视频
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14890267/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
stop all videos when a new video is played
提问by satya
I need some help with Youtube API and embeded videos. I want to stop all iframe videos (here i have taken only 3, but there are several videos)running on the current page when a new youtube video is clicked. At one point of time, only one iframe youtube video should run. I have gone thruogh documentation [https://developers.google.com/youtube/js_api_reference][1] and was able to write till here...
我需要一些有关 Youtube API 和嵌入视频的帮助。当单击新的 youtube 视频时,我想停止在当前页面上运行的所有 iframe 视频(这里我只拍摄了 3 个,但有几个视频)。在某个时间点,应该只运行一个 iframe youtube 视频。我已经通过文档 [https://developers.google.com/youtube/js_api_reference][1] 并且能够写到这里......
Updated:
更新:
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="http://www.youtube.com/player_api"></script>
<script type="text/javascript">
var player;
function onYouTubeIframeAPIReady() {
player = new YT.Player('player', {
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
}
var done = false;
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.PLAYING && !done) {
alert("hi5");
player1.stopVideo();
player2.stopVideo();
done = true;
}
}
</script>
</head>
<body>
<div>TODO write content</div>
<ul class="image-grid" id="list">
<li>
<iframe id="player" width="385" height="230" src="http://www.youtube.com/embed/erDxb4IkgjM?rel=0&wmode=Opaque&enablejsapi=1;showinfo=0;controls=0" frameborder="0" allowfullscreen></iframe>
</li>
<li>
<iframe id="player1" width="385" height="230" src="http://www.youtube.com/embed/wSrA5iQGlDc?rel=0&wmode=Opaque&enablejsapi=1;showinfo=0;controls=0" frameborder="0" allowfullscreen></iframe>
</li>
<li>
<iframe id="player2" width="385" height="230" src="http://www.youtube.com/embed/c7b_WLkztXc?rel=0&wmode=Opaque&enablejsapi=1;showinfo=0;controls=0" frameborder="0" allowfullscreen></iframe>
</li>
</ul>
</body>
</html>
UPDATED
更新
- onStateChange event is not getting triggered(working)
- In this example i have 3 videos, in reality it has more videos instead of writing onPlayerStateChange for each video..is it possible to use an array for all the videos..and in the function onPlayerStateChange, to write player[].stopVideo() and this.playvideo()..something of this sort..(help required) please see this fiddle http://jsfiddle.net/LakshmiV/kn5Sf/Please help.
- onStateChange 事件没有被触发(工作)
- 在这个例子中,我有 3 个视频,实际上它有更多的视频,而不是为每个视频编写 onPlayerStateChange。 ) 和 this.playvideo()..这种类型的东西..(需要帮助)请看这个小提琴http://jsfiddle.net/LakshmiV/kn5Sf/请帮忙。
回答by Anubhav Ranjan
You can do something like this...
你可以做这样的事情......
Give every iframe a class so that it can be identified as an iframe for youtube player. Here I have given "yt_players"
给每个 iframe 一个类,以便它可以被识别为 youtube 播放器的 iframe。在这里我给了“yt_players”
Now you can use the below code...
现在您可以使用以下代码...
<script type="text/javascript">
players = new Array();
function onYouTubeIframeAPIReady() {
var temp = $("iframe.yt_players");
for (var i = 0; i < temp.length; i++) {
var t = new YT.Player($(temp[i]).attr('id'), {
events: {
'onStateChange': onPlayerStateChange
}
});
players.push(t);
}
}
onYouTubeIframeAPIReady();
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.PLAYING) {
var temp = event.target.a.src;
var tempPlayers = $("iframe.yt_players");
for (var i = 0; i < players.length; i++) {
if (players[i].a.src != temp)
players[i].stopVideo();
}
}
}
</script>
Have updated the code...This should be of help to you.
已更新代码...这应该对您有所帮助。
See it in here...http://jsfiddle.net/anubhavranjan/Y8P7y/
在这里看到它...... http://jsfiddle.net/anubhavranjan/Y8P7y/
回答by grmdgs
Great answer by Cobyto a similar question at https://stackoverflow.com/a/13260520/835822
Coby在https://stackoverflow.com/a/13260520/835822 上对类似问题的出色回答
Using an attribute selectoryou can target any iframe that comes from Youtube and then using jQuery's eachyou can loop through all of them.
使用属性选择器,您可以定位来自 Youtube 的任何 iframe,然后使用jQuery 的 each您可以遍历所有iframe 。
$(function(){
$('iframe[src*="http://www.youtube.com/embed/"]').each(function(i) {
this.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}', '*');
});
});
});
回答by Venki
Good concept, but event.target.a.src doesn't work! Changed it to event.target.getVideoUrl() and it works fine. check it out here
好概念,但 event.target.a.src 不起作用!将其更改为 event.target.getVideoUrl() 并且工作正常。在这里查看
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.PLAYING) {
var temp = event.target.getVideoUrl();
var tempPlayers = $("iframe.yt_players");
for (var i = 0; i < players.length; i++) {
if (players[i].getVideoUrl() != temp) players[i].stopVideo();
}
}
}
}