YouTube iframe API - 为什么onError事件会被调用两次?

5
我在使用YouTube API中的onError事件时遇到了一些问题。下面是一个带有虚假videoId的脚本,用于创建调用onPlayerError函数的错误。不幸的是,我不明白为什么会调用两次错误函数。我认为可能与回调响应在函数内部有关(也许?),但当videoId正确时,onReady或onStateChange都不会被调用两次。有人能看出任何明显的问题吗?提前谢谢。
顺便说一句:是的,我确实需要回调和回调内的响应。这是我的完整脚本的缩短版本。
<!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>

onError函数是否抛出了相同的响应两次?一个解释可能是,onError函数遇到了2个不同的错误,导致它被调用两次。您能否通过错误日志输出更新我们遇到的错误? - pointNclick
1
错误2指的是:“请求包含无效的参数值。例如,如果您指定的视频ID不具有11个字符,或者视频ID包含无效字符(例如感叹号或星号),则会发生此错误。”不知道是否会因为多于一个字符而抛出该错误两次。但是,您的视频ID或其他参数肯定存在问题,需要进行修复。 - pointNclick
1
@garrettlynch 你最后解决了这个问题吗?我目前也在苦恼。 - Shakeel
1
不,我没有。我停止工作是因为YouTube API存在一个更大的问题:无法区分录制的视频和直播。后者在当时还很新,所以我正在等待API跟上步伐。我认为我所做的就是编写一个脚本,如果错误相同则忽略这些错误中的一个 - 这并不是非常优雅的解决方案。 - garrettlynchirl
1
同样的问题,只有在错误代码为2时才会出现。在其他错误情况下,它只运行一次。有人知道原因吗? - RobbTe
显示剩余2条评论
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接