YouTube iframe API – почему событие onError вызывается дважды?

У меня возникли проблемы с событием onError в API YouTube. Ниже приведен скрипт с поддельным видеоидентификатором для создания ошибки, которая вызывает функцию onPlayerError. К сожалению, я не могу понять, почему функция ошибки вызывается дважды. Я думаю, что это может быть как-то связано с тем, что ответ обратного вызова находится внутри функции (может быть?), Но ни onReady, ни onStateChange не вызываются дважды, когда videoId правильный. Может ли кто-нибудь увидеть какие-либо очевидные проблемы? Заранее спасибо.

Кстати: да, мне нужен обратный вызов и ответ внутри обратного вызова. Это сокращенная версия моего полного сценария.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="en">

<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<!-- jQuery -->
<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.0.min.js"></script>

<!-- jQuery / javascript for page -->
<script type='text/javascript'>
//<![CDATA[ 

//create deferred object
var YTdeferred = $.Deferred();

//attach a function to onYouTubeIframeAPIReady
window.onYouTubeIframeAPIReady = function() {
    //resolve when youtube callback is called passing YT as a parameter
    YTdeferred.resolve(window.YT);
    console.log('Resolved');
};

//embed youtube api script
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

//create player variable
var player;

//create YouTube player
function createyoutubeplayer(nextPageToken)
{
    //whenever youtube callback was called = deferred resolved
    //your custom function will be executed with YT as an argument
    YTdeferred.done(function(YT) {
    console.log("create player");
        //create new player
        player = new YT.Player('player', {
            height: '390',
            width: '640',
            videoId: 'fff',
            playerVars: {
                'rel': 0,
                'autohide': 1,
                'controls': 1,
                'showinfo': 0,
                'iv_load_policy': 3,
                'fs': 0,
                'modestbranding': 0,
                'playsinline': 1,
                'enablejsapi': 1
            },
            events: {
                'onError': onPlayerError,
                'onReady': onPlayerReady,
                'onStateChange': onPlayerStateChange
            }
        });
    });
}

//when YouTube player is ready
function onPlayerReady(event)
{
    //play video
    event.target.playVideo();

    //unmute sound and set the volume
    event.target.unMute();
    event.target.setVolume(80);
}

//when YouTube video ends
function onPlayerStateChange(event)
{       
    //if finished playing     
    if(event.data === 0)
    {     
        //call next video function       
        //nextvideo(event);
    }
}

function onPlayerError(event)
{
    //call next video function  
    //nextvideo(event);
    console.log('Error: ' + event.data);
    player.stopVideo();
}


createyoutubeplayer();

//]]>  
</script>

</head>

<body>

    <!-- video player -->
    <div id="player"></div>

</body>
</html>

person garrettlynchirl    schedule 07.08.2015    source источник
comment
Функция onError дважды выдает один и тот же ответ? Одним из объяснений может быть то, что функция onError сталкивается с двумя отдельными ошибками, что приводит к ее двойному вызову. Можете ли вы проинформировать нас о том, с какими ошибками вы сталкиваетесь в выводе журнала ошибки?   -  person pointNclick    schedule 11.08.2015
comment
onPlayerError дважды выдает ошибку 2. Ошибка - это правильная ошибка, которую я тестирую, но я не могу понять, почему она вызывается дважды. Функция, из которой он вызывается, вызывается только один раз. Как будто запрос на видео происходит дважды.   -  person garrettlynchirl    schedule 11.08.2015
comment
Ошибка 2 относится к этому: Запрос содержит недопустимое значение параметра. Например, эта ошибка возникает, если вы указываете идентификатор видео, который не содержит 11 символов, или если идентификатор видео содержит недопустимые символы, например восклицательные знаки или звездочки. Интересно, выдаст ли он эту ошибку дважды для более чем одного символа. Однако что-то определенно не так с вашим идентификатором видео или другими параметрами, которые необходимо исправить.   -  person pointNclick    schedule 11.08.2015
comment
Я знаю, что такое ошибка 2, и я знаю, что мой видеоидентификатор неверен. Как указано в исходном вопросе, идентификатор является поддельным, чтобы проверить обработку ошибок и спроектировать, что произойдет в случае ошибки.   -  person garrettlynchirl    schedule 12.08.2015
comment
@garrettlynch ты когда-нибудь это понимал? сейчас борюсь с этим   -  person Shakeel    schedule 04.01.2016
comment
Нет, я этого не сделал. Я перестал работать над этим из-за более серьезной проблемы API YouTube, не различающего записанные видео и прямые трансляции. Последний из них был новым в то время, поэтому я жду, пока API догонит. Я думаю, что все, что мне удалось сделать для повторяющихся ошибок, это написать скрипт, который игнорировал бы одну из ошибок, если бы они были одинаковыми - не особенно элегантно.   -  person garrettlynchirl    schedule 26.01.2016
comment
То же самое здесь происходит только тогда, когда код ошибки равен 2. При других ошибках он запускается только один раз. Любой?   -  person RobbTe    schedule 20.12.2018


Ответы (1)


Я думаю, вам не хватает Слушателя.

player.addEventListener(event:String, listener:String):Void

https://developers.google.com/youtube/iframe_api_reference#addEventListener

person Paulo St    schedule 11.04.2018