【问题标题】:YouTube iframe api - why is onError event being called twice?YouTube iframe api - 为什么 onError 事件被调用两次?
【发布时间】:2015-10-30 23:13:43
【问题描述】:

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 个单独的错误,导致它被调用两次。你能告诉我们你在错误的日志输出中遇到了什么错误吗?
  • 错误2指的是:“请求包含无效的参数值。例如,如果您指定的视频ID不包含11个字符,或者如果视频ID包含无效字符,则会出现此错误,例如感叹号或星号。”想知道它是否会为不止一个字符引发两次该错误。但是,您的视频 ID 或其他需要修复的参数肯定有问题。
  • @garrettlynch 你有想过这个吗?我目前正在努力解决这个问题
  • 不,我没有。由于 YouTube API 无法区分录制的视频和直播的更大问题,我停止了它的工作。后者在当时是新的,所以我正在等待 API 赶上来。我认为我为重复出现的错误所做的一切就是编写一个脚本,如果它们相同,它将忽略其中一个错误 - 不是特别优雅。
  • 这里相同,仅在错误代码为 2 时发生。在其他错误上它只运行一次。有人吗?

标签: jquery callback youtube-api youtube-javascript-api youtube-iframe-api


【解决方案1】:

我认为您缺少侦听器。

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

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

【讨论】:

    猜你喜欢
    • 2013-03-13
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2017-01-22
    • 2021-09-15
    • 1970-01-01
    • 2021-07-13
    • 2021-11-25
    相关资源
    最近更新 更多