为了演示我今天发现的重大变化,我采用了基本的JS API示例页面,可以在下面的链接中找到并简单地注释掉videoId参数:
YT示例代码演示初始化错误:http://www.multitask123.com/fmgem/YT_Sample2.htm
通过删除videoId参数,播放器现在将在嵌入式播放器中显示/初始化以下错误消息,"发生错误。请稍后再试。"直到今天下午才出现这种情况。
过去三个月,我可以按照以下方式调用YouTubePlayerAPIReady,并且不会出现错误消息:
function onYouTubePlayerAPIReady() {
player = new YT.Player('player', {
height: '390',
width: '640',
//videoId: 'JW5meKfy3fY', - COMMENTED OUT INTENTIONALLY! HARD REQUIREMENT!
events: {
'onReady': onPlayerReady,
'onError': onPlayerError,
'onStateChange': onPlayerStateChange
}
});
}
错误在初始化期间被onPlayerError事件处理程序捕获,并且错误来自" evt"参数的数据属性。因此onPlayerError(evt)在初始化时调用,evt.data = 2.此值记录为,"请求包含无效参数值"这显然是期待videoId的API。
我不想详细介绍,但我花了无数个小时让播放器的初始化工作正常,因为存在大量的跨浏览器初始化问题。我需要隐藏玩家,直到我真的需要它来玩。
我忘了哪个浏览器是罪魁祸首,但其中一个实际上迫使我显示播放器,即使没有播放视频。
我发现我无法延迟加载/ JIT嵌入式播放器,因为它异步加载所以如果我尝试仅在我的用户希望实际查看视频时加载它,或者所涉及的URL的其他参数将加载播放列表例如,玩家将会犹豫不决,因为我不能同时初始化播放器并要求播放视频。
所以底线是在页面加载时要初始化的玩家NEEDS,但不是带有videoId参数,因为很简单我不知道在90%的情况下会播放什么,即使我这样做了将是对不同API的不同异步调用的结果。我这样说是因为使用videoid初始化它的解决方案是不可接受的。
YouTube API非常棒,我非常喜欢它,所以我花了18个月的时间开发http://www.fmgem.com,现在这个重大改变正在破坏测试用户对我的应用的第一印象。因此,如果YT API团队确实对此进行了监控,请将其更改回来。相当请在上面加糖。 :))
几周前类似的事情在加载时具有相同功能的wmode属性。
// wmode:' opaque' // ---导致Chrome中的邪恶错误 - 而且我能够将不透明变为透明,所以没有大问题,但这需要我审查我的整个架构并有条不紊地处理apx 9个不同的异步用例再加载,所有人都有跨浏览器的怪癖。
所以我不能被动反应而且我被迫投入打喷嚏的小熊猫" videoId进入http://www.fmgem.com的实时代码,但这看起来非常不专业,它只是一个创可贴,直到我可以审查整个架构,除非YT团队实际上承认这是一个突破性的变化,然后将其恢复到以前的行为
有些用户在2013年2月27日下午的某个时间检测到这种情况,并且我已经阅读了YouTube开发人员监控的Google群组。
非常感谢任何答案,解决方案,指导或确认。
谢谢!
答案 0 :(得分:1)
您最初可以加载0秒的空白电影。或者你可以稍微重新安排你的代码。
请勿自行致电onYouTubePlayerAPIReady
。改为使用标志变量:
var playerAPIReady;
var player;
当API文件调用onYouTubePlayerAPIReady
函数时设置第一个变量:
function onYouTubePlayerAPIReady() {
playerAPIReady = true;
}
当用户选择播放第一个视频时设置第二个变量:
function createPlayerAndPlayVideo(id) {
if(! playerAPIReady) {
// player API file not loaded
return;
}
if (! player) {
player = new YT.Player('player', {
height: '390',
width: '640',
videoId: id
events: {
'onReady': onPlayerReady,
'onError': onPlayerError,
'onStateChange': onPlayerStateChange
}
});
} else {
player.loadVideoById(id);
}
}
为else
块中显示的后续视频重复使用同一播放器。
答案 1 :(得分:0)
虽然这是一个突破性的变化,但现在我睡了个好觉,我找到了一个解决我自己的问题来解决延迟加载/ JIT的问题。
解决方案我有一个概念证明,目前正在实施,就像设置全局变量来测试我是否有视频一样简单。
var cleared = false;
function onYouTubePlayerAPIReady(videoid) {
if (!cleared) return;
.....
然后,当我真的想要播放视频时,我只看到变量是否为假,如果是,我调用onYouTubePlayerAPIReady函数并将视频传递给它并初始化它。我的错误是尝试初始化然后在同一个调用中调用play()函数。我的解决方案是使用id调用初始化程序,或者如果已经初始化则调用playbyid函数。
虽然我确实喜欢YT公共API以及我使用它的其他人确实打开了许多重大变化的大门,但这始终是对一个人的建筑和精神毅力的考验。
答案 2 :(得分:0)
我不排除2月27日某些事情可能发生了变化,但初衷是在初始化iframe播放器时需要videoId
(或列表ID)。它没有在documentation中明确说明,但同时,它从不暗示参数是可选的,并且给出的所有示例都包含videoId
的值。
所以我不会指望将来改变这种行为。
当您想要初始化且不可见的YouTube iframe播放器时,最常见的事情是使用CSS在浏览器中的可查看区域之外设置其位置(例如使用负{{1} }和x
坐标)。您可以使用所需的任何占位符视频初始化播放器,然后在准备好播放真实视频时调用y
,并在用loadVideoById()
或{{1}检测到onStateChange
时你可以将玩家移动到适当的可见位置。
或者,你可以延迟加载播放器,直到你需要它为止。