我有一个聊天室,我为了练习目的而做得更好;已经在node.js服务器上运行了socket.io,但我决定制作自己的无线电。
以下是属于收音机的代码:
HTML:
<div data-video="1cDxhcAOpa8"
data-autoplay="1"
data-loop="1"
id="youtube-audio">
<form id="formMusica">
<select id="selectGenero">
<option value="edm" selected>EDM</option>
<option value="rock">Rock</option>
</select>
</form>
<script src="https://www.youtube.com/iframe_api"></script>
<script id="scriptYt" src="/yt.js"></script>
<script type="text/javascript">
$(document).ready(function () {
var $container = $('#youtube-audio');
var $formGenero = $('#formMusica');
var $select = $('#selectGenero');
var $genero;
$formGenero.submit(function (e) {
e.preventDefault();
});
$select.change(function () {
$genero = $select.val();
buildPlayer();
});
var radios = [{
'name': 'Pixl',
'genre': 'EDM',
'type': 'video',
'ytd_id': 'cDxhcAOpa8'
}, {
'name': 'Best Rock Music',
'genre': 'Rock',
'type': 'playlist',
'ytd_id': 'PLZN_exA7d4RVmCQrG5VlWIjMOkMFZVVOc'
}];
function buildPlayer() {
var genreData = getGenreData();
// Erase all to build again
$container.html('');
if (genreData.type === 'video') {
$container.attr('data-video', genreData.ytd_id)
.removeAttr('data-listtype').removeAttr('data-list');
}
else if (genreData.type === 'playlist') {
$container.attr('data-list', genreData.ytd_id)
.attr('data-listtype', genreData.type).removeAttr('data-video');
}
// #scriptYt's code will be below
$('#scriptYt').remove();
$('body').append('<script id="scriptYt" src="/yt.js"><\/script>');
onYouTubeIframeAPIReady();
}
function getGenreData() {
for (i = 0; i < radios.length; i++) {
if (radios[i].genre.toLowerCase() === $genero) {
return radios[i];
}
}
}
});
</script>
YT.JS:
var r;
function onYouTubeIframeAPIReady() {
var $container = $('#youtube-audio');
$container.append('<i class="fa fa-2x" id="youtube-icon"></i>');
var $icon = $('#youtube-icon');
$icon.css({ 'transition': '0.5s', 'cursor': 'pointer' });
$container.append('<div id="youtube-player"></div>');
var o = function (e) {
var a = e ? 'fa-stop' : 'fa-play';
if (a === 'fa-stop') {
$icon.addClass('fa-stop');
$icon.addClass('text-danger');
$icon.removeClass('fa-play');
$icon.removeClass('text-success');
}
else if (a === 'fa-play') {
$icon.addClass('fa-play');
$icon.addClass('text-success');
$icon.removeClass('fa-stop');
$icon.removeClass('text-danger');
}
};
$container.click(function () {
r.getPlayerState() === YT.PlayerState.PLAYING || r.getPlayerState() === YT.PlayerState.BUFFERING ? (r.pauseVideo(), o(!1)) : (r.playVideo(), o(!0));
});
r = new YT.Player('youtube-player', {
height: '0',
width: '0',
videoId: $container.data('video'),
playerVars: {
listType: $container.data('listtype'),
list:$container.data('list'),
autoplay: $container.data('autoplay'),
loop: $container.data('loop')
},
events: {
onReady: function (e) {
r.setPlaybackQuality('small'),
o(r.getPlayerState !== YT.PlayerState.CUED)
},
onStateChange: function (e) {
e.data === YT.PlayerState.ENDED && o(!1)
}
}
});
}
首次加载页面时效果很好,然后当您选择其他类型时,它会保留相同的视频,我尝试删除#youtube-audio
内的所有内容和脚本标记,然后再次插入标记并调用方法,它每次加载相同的视频。
OBS:我很了解JavaScript,但如果可能,我更喜欢jQuery。
更新:感谢@matthewninja,r.loadVideoById()
有效,但我仍然需要使用播放列表,r.loadPlaylist()
无效。
答案 0 :(得分:0)
无需销毁先前存在的播放器元素即可更改视频。根据{{3}},您只需拨打player.loadVideoById(videoId)
即可更改歌曲。
话虽如此,这是我使用改变歌曲的按钮实现的解决方案:
<强> HTML 强>
<html>
<head>
<script
src="http://code.jquery.com/jquery-3.2.1.js"
integrity="sha256-DZAnKJ/6XZ9si04Hgrsxu/8s717jcIzLy3oi35EouyE="
crossorigin="anonymous"></script>
</head>
<body>
<div data-video="1cDxhcAOpa8"
data-autoplay="1"
data-loop="1"
id="youtube-audio">
<button onclick="changeSong()">change song</button>
<script src="https://www.youtube.com/iframe_api"></script>
<script id="scriptYt" src="yt.js"></script>
</div>
</body>
</html>
<强> yt.js 强>
var r;
function onYouTubeIframeAPIReady() {
var $container = $('#youtube-audio');
$container.append('<i class="fa fa-2x" id="youtube-icon"></i>');
var $icon = $('#youtube-icon');
$icon.css({ 'transition': '0.5s', 'cursor': 'pointer' });
$container.append('<div id="youtube-player"></div>');
var o = function (e) {
var a = e ? 'fa-stop' : 'fa-play';
if (a === 'fa-stop') {
$icon.addClass('fa-stop');
$icon.addClass('text-danger');
$icon.removeClass('fa-play');
$icon.removeClass('text-success');
}
else if (a === 'fa-play') {
$icon.addClass('fa-play');
$icon.addClass('text-success');
$icon.removeClass('fa-stop');
$icon.removeClass('text-danger');
}
};
$container.click(function () {
r.getPlayerState() === YT.PlayerState.PLAYING || r.getPlayerState() === YT.PlayerState.BUFFERING ? (r.pauseVideo(), o(!1)) : (r.playVideo(), o(!0));
});
r = new YT.Player('youtube-player', {
height: '0',
width: '0',
videoId: $container.data('video'),
playerVars: {
listType: $container.data('listtype'),
list:$container.data('list'),
autoplay: $container.data('autoplay'),
loop: $container.data('loop')
},
events: {
onReady: function (e) {
r.setPlaybackQuality('small'),
o(r.getPlayerState !== YT.PlayerState.CUED)
},
onStateChange: function (e) {
e.data === YT.PlayerState.ENDED && o(!1)
}
}
});
}
function changeSong(){
r.loadVideoById("mHpZ-ZFZwiY");
}
当用户点击该按钮时,视频将更改为由loadVideoById
赋予的参数指定的视频。有了这个功能,您应该可以更轻松地实现理想的解决方案。您可以修改changeSong()
函数以接受来自<select>
元素的参数。