【发布时间】:2014-02-13 15:11:57
【问题描述】:
我正在尝试构建一个 Chrome 扩展程序以使用 Youtube 的 iframe API 显示 Youtube 视频。但是,玩家的 OnReady 事件永远不会触发。从这里以前的帖子中,我认为这是由于 Youtube 无法访问播放器,因为它是本地实例化。
我想知道:有没有办法让它工作?
我的代码在弹出窗口中实例化播放器。我想通过将视频 ID 传递给播放器的 loadVideoById 函数来向播放器播放新视频。 这是我的播放器的代码(在一个名为“youtube.js”的文件中):
function loadPlayer() {
var popups = chrome.extension.getViews({type: "popup"});
if (popups.length != 0) {
var popup = popups[0];
console.log("Popup found, starting to load the player...");
var tag = popup.document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = popup.document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
var done = false;
console.log("Finished loading the player.");
}
}
onYouTubeIframeAPIReady 函数如下:
function onYouTubeIframeAPIReady() {
console.log("Starting to instantiate the player...");
var popups = chrome.extension.getViews({type: "popup"});
if (popups.length != 0) {
var popup = popups[0];
popup.document.ytplayer = new YT.Player('player', {
height: '200',
width: '300',
videoId: 'V4n6OjoPuJc',
playerVars: {
origin: 'location.origin',
showinfo: 0,
controls: 1,
playsinline: 1,
autoplay: 0
},
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
})
};
console.log("Player element created.");
console.log(popup.document.ytplayer);
}
popup.html 文件有一个播放器的 div:
<div id="player"></div>
玩家应该有足够的权利。 manifest.json 文件中包含的安全策略:
"content_security_policy": "script-src 'self' https://www.youtube.com/iframe_api https://s.ytimg.com/yts/jsbin/www-widgetapi-vfldKI4RW.js https://s.ytimg.com/yts/jsbin/www-widgetapi-vflgGL-5Q.js; object-src 'self'",
播放器实例化很好,并且能够播放我硬编码的初始 videoId。但是,玩家的 OnReady 事件似乎没有触发。此外,对于创建的播放器,API 的大部分功能都无法使用(即,如果我尝试传递新的 videoId,则返回诸如“TypeError:Object # has no method 'loadVideoById'”之类的错误)。从之前的帖子中,我了解到这些问题有一个相同的根源:Youtube 无法与我的播放器通信,因为它没有关联的域。
有没有办法做到这一点?如果是这样,我做错了什么?非常感谢!
有几个相关的帖子可用;但是,这些是 web html 播放器,它们确实有自己的域(如果这是表达它的正确方式),Chrome 扩展程序并非如此。 YouTube API onPlayerReady not firing Youtube Embed Iframe - Events Not Firing In Local
还有另一个相关的帖子,但这并没有针对这个特定问题提出问题。 Youtube API player chrome extension
【问题讨论】:
标签: javascript iframe google-chrome-extension youtube