如何动态更改YouTube播放器的选项

时间:2017-07-30 23:36:47

标签: javascript jquery youtube-api

我有一个聊天室,我为了练习目的而做得更好;已经在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()无效。

1 个答案:

答案 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>元素的参数。