Javascript YouTube API目标(多个)现有iframe
我试图理解如何使用YouTube API(即不使用脚本构建iframe)来定位现有的iframe 像往常一样,谷歌没有给出足够的API示例,但在这里解释说这是可能的 下面是我尝试做的一个例子-缩略图下面的视频应该播放。我快到了,但只有第一个视频播放 TL;DR:演示:Javascript YouTube API目标(多个)现有iframe,javascript,youtube-api,youtube-javascript-api,Javascript,Youtube Api,Youtube Javascript Api,我试图理解如何使用YouTube API(即不使用脚本构建iframe)来定位现有的iframe 像往常一样,谷歌没有给出足够的API示例,但在这里解释说这是可能的 下面是我尝试做的一个例子-缩略图下面的视频应该播放。我快到了,但只有第一个视频播放 TL;DR:演示: YT\u ready、getFrameID和onYouTubePlayerAPIReady是中定义的函数。这两种方法都可以在没有任何预加载库的情况下实现。在我之前的回答中,我展示了一种为单个帧实现该功能的方法 在这个答案中,我将重
YT\u ready
、getFrameID
和onYouTubePlayerAPIReady
是中定义的函数。这两种方法都可以在没有任何预加载库的情况下实现。在我之前的回答中,我展示了一种为单个帧实现该功能的方法
在这个答案中,我将重点放在多个帧上
HTML示例代码(重要标记和属性大写,
):
在我之前的回答中,我绑定了onStateChange
事件。在本例中,我使用了onReady
事件,因为您只想在初始化时调用函数一次
此示例的工作原理如下:
- 中定义了以下方法
- YouTube框架API是从加载的
- 当这个外部脚本完成加载后,会调用
,这反过来会激活使用onyoutublayerapiready
定义的所有函数YT\u ready
- 此处显示了以下方法的声明,但使用实现。基于示例的解释:
- 循环遍历每个
对象,该对象正好位于
之后 - 在每个帧元素处,检索
,并将其存储在id
变量中标识符
- iframe的内部ID通过
检索。这可确保为API正确格式化getFrameID
。在这个示例代码中,返回的ID等于
,因为我已经将ID附加到标识符
- 当
存在并且是有效的YouTube视频时,将创建一个新的播放器实例,并将引用存储在
对象中,可通过键players
访问frameID
- 在创建播放器实例时,定义了**
*事件。当为帧完全初始化API时,将调用此方法onReady
createyEvent
此方法返回一个动态创建的函数,该函数为单独的播放器添加功能。守则最相关的部分包括:function createYTEvent(frameID, identifier) { return function (event) { var player = players[frameID]; // Set player reference ... player.playVideo(); } }
是框架的ID,用于启用YouTube框架APIframeID
是在标识符
中定义的ID,不一定是YT\u ready
元素
将尝试为给定id查找最接近的匹配帧。也就是说,它返回给定getFrameID
元素的id,或者:如果给定元素不是
,函数将查找一个子元素
,并返回此帧的id。如果帧不存在,函数将通过
后缀给定ID-frame
- players[playerID]`指初始化的播放器实例李>
。在这些回答中,我展示了YouTube Frame/JavaScript API的各种实现。演示您的问题。我现在得走了,所以我在接下来的几个小时内无法回复。谢谢Rob,你的编码给我留下了深刻的印象!顺便问一下,为什么在视频前绝对定位图像是一种安全措施?好奇。@SparrwHawk One可以在第三方框架前放置(部分)透明的元素/图像,并欺骗用户共享不需要的信息。这是一个巨大的潜在安全问题。好吧,这很公平,但在搜索引擎优化等方面没有惩罚。尽管如此?这只是一种道德考虑,对吗?@SparrwHawk大多数现代浏览器都不允许(部分)不可见元素重叠框架。这不是对搜索引擎优化或道德的惩罚,而是对可访问性的惩罚。该按钮将永远无法单击,因为iframe位于其上方。但是:在答案处查看+演示。哇,好吧,我想我已经找到了解决问题的方法,但是对于一个简单的API来说似乎非常复杂-
var players = {}; //Define a player storage object, to expose methods,
// without having to create a new class instance again.
YT_ready(function() {
$(".thumb + iframe[id]").each(function() {
var identifier = this.id;
var frameID = getFrameID(identifier);
if (frameID) { //If the frame exists
players[frameID] = new YT.Player(frameID, {
events: {
"onReady": createYTEvent(frameID, identifier)
}
});
}
});
});
// Returns a function to enable multiple events
function createYTEvent(frameID, identifier) {
return function (event) {
var player = players[frameID]; // Set player reference
var the_div = $('#'+identifier).parent();
the_div.children('.thumb').click(function() {
var $this = $(this);
$this.fadeOut().next().addClass('play');
if ($this.next().hasClass('play')) {
player.playVideo();
}
});
}
}
function createYTEvent(frameID, identifier) {
return function (event) {
var player = players[frameID]; // Set player reference
...
player.playVideo();
}
}