我刚刚注意到,当我在本地测试时,Youtube事件(onReady、onStateChange)不再触发,而是在我将代码上传到JsFiddle时工作。我决定从Youtube Player API复制并粘贴代码,在那里我可以验证它确实不起作用。其他人有这个问题吗?此问题出现在Chrome、Firefox、IE、Safari和Opera上。
编辑-当我在本地console.log(player);
时,我发现它缺少JsFiddle中的许多Youtube功能,如seekTo()
、setVolume()
、showVideoInfo()
。我不确定为什么会发生这种情况,但我相信这可能是我问题的根源。有什么想法吗?
http://jsfiddle.net/8ZmKx/
<!DOCTYPE html>
<html>
<body>
<!-- 1. The <iframe> (and video player) will replace this <div> tag. -->
<div id="player"></div>
<script>
// 2. This code loads the IFrame Player API code asynchronously.
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
// 3. This function creates an <iframe> (and YouTube player)
// after the API code downloads.
var player;
function onYouTubeIframeAPIReady() {
player = new YT.Player('player', {
height: '190',
width: '140',
videoId: 'M7lc1UVf-VE',
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
}
// 4. The API will call this function when the video player is ready.
function onPlayerReady(event) {
console.log('ready');
event.target.playVideo();
}
// 5. The API calls this function when the player's state changes.
// The function indicates that when playing a video (state=1),
// the player should play for six seconds and then stop.
var done = false;
function onPlayerStateChange(event) {
console.log('change');
if (event.data == YT.PlayerState.PLAYING && !done) {
setTimeout(stopVideo, 6000);
done = true;
}
}
function stopVideo() {
player.stopVideo();
}
</script>
</body>
</html>
Youtube iframe API目前似乎已损坏,但我还没有看到官方确认
另请参阅:
在模板中显式写入iframe时,onReady回调未启动
YouTube API onPlayerReady未启动
编辑:以下是修复方法:https://code.google.com/p/gdata-issues/issues/detail?id=5670#c6
以下是上面链接中的答案的直接引用:
快速解决方法是添加原点=http://www.example.com(替换与您的服务器全域;请确保使用http://或https://适用于您的网站)添加到玩家的src=属性iframe元素。请确保origin=属性的值与主机域和URL方案完全匹配。例如
<iframe
type="text/html"
width="640"
height="480"
src="https://www.youtube.com/embed/VIDEO_ID?enablejsapi=1&origin=https://www.example.com"
frameborder="0">
</iframe>
我目前正在与工程团队合作,以确定origin=是否需要继续前进,或者需求可以恢复,但这是立即解决的问题。道歉同时,由于缺乏先进的沟通和沟通。
如果使用YT.Player()构造函数创建iframe元素对你来说,这不是一个问题——这有点边缘化明确包含iframe元素作为他们页面的HTML。
我实现了上面的修复,它对我有效。
我已经进行了修复,实现了"origin="param,修复了原始错误并触发了状态更改事件。
现在,具有该原始参数是导致错误的原因。删除了参数,它又能工作了。