【问题标题】:YouTube API Target (multiple) existing iframe(s)YouTube API 目标(多个)现有 iframe
【发布时间】:2012-02-15 10:21:03
【问题描述】:

我正在尝试了解如何使用 YouTube API 定位现有 iframe(即不使用脚本构建 iframe)。

像往常一样,谷歌没有给出足够多的 API 示例,但解释说这是可能的,这里http://code.google.com/apis/youtube/iframe_api_reference.html

这是我正在尝试做的一个示例 - 缩略图下方的视频应该播放。我快到了,但只有第一个视频播放...

http://jsfiddle.net/SparrwHawk/KtbYR/2/

【问题讨论】:

标签: javascript youtube-api youtube-javascript-api


【解决方案1】:

TL;DR:演示:http://jsfiddle.net/KtbYR/5/

YT_readygetFrameIDonYouTubePlayerAPIReadythis answer 中定义的函数。这两种方法都可以在没有任何预加载库的情况下实现。在我之前的回答中,我展示了一种实现单帧功能的方法。

在这个答案中,我关注多个帧。

HTML示例代码(重要标签和属性大写,<iframe src id>):

<div>
  <img class='thumb' src='http://i2.cdnds.net/11/34/odd_alan_partridge_bio_cover.jpg'>
  <IFRAME ID="frame1" SRC="http://www.youtube.com/embed/u1zgFlCw8Aw?enablejsapi=1" width="640" height="390" frameborder="0"></IFRAME>
</div>
<div>
  <img class='thumb' src='http://i2.cdnds.net/11/34/odd_alan_partridge_bio_cover.jpg'>
  <IFRAME ID="frame2" SRC="http://www.youtube.com/embed/u1zgFlCw8Aw?enablejsapi=1" width="640" height="390" frameborder="0"></IFRAME>
</div>

JavaScript 代码(YT_readygetFrameIDonYouTubePlayerAPIReadyYouTube Frame API 脚本加载器定义为 here

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();
            }
        });
    }
}

在我之前的回答中,我绑定了onStateChange 事件。在此示例中,我使用了onReady 事件,因为您只想在初始化时调用函数一次。

这个例子的工作原理如下:

  • this answer中定义了以下方法。

    1. YouTube Frame API 是从 http://youtube.com/player_api 加载的。
    2. 当这个外部脚本完成加载时,onYoutubePlayerAPIReady 被调用,这反过来又激活了使用YT_ready 定义的所有函数
  • 此处显示了以下方法的声明,但使用this answer 实现。基于例子的解释:

    1. 循环遍历每个&lt;iframe id&gt; 对象,该对象位于&lt;.. class="thumb"&gt; 之后。
    2. 在每个框架元素中,都会检索 id,并将其存储在 identifier 变量中。
    3. iframe 的内部 ID 通过getFrameID 检索。这可确保为 API 正确格式化 &lt;iframe&gt;在这个示例代码中,返回的 ID 等于 identifier,因为我已经将一个 ID 附加到了 &lt;iframe&gt;
    4. &lt;iframe&gt; 存在且YouTube 视频有效时,将创建一个新的播放器实例,并将引用存储在players 对象中,可通过键frameID 访问。
    5. 在创建播放器实例时,定义了一个**onReady* 事件。当框架的 API 完全初始化时,将调用此方法。
    6. createYTEvent
      此方法返回一个动态创建的函数,该函数为单独的播放器添加了功能。代码中最相关的部分是:

      function createYTEvent(frameID, identifier) {
          return function (event) {
              var player = players[frameID]; // Set player reference
              ...
                      player.playVideo();
          }
      }
      
      • frameID 是框架的 ID,用于启用 YouTube 框架 API
      • identifierYT_ready 中定义的 ID,不一定是 &lt;iframe&gt; 元素。 getFrameID 将尝试为给定的 id 找到最接近的匹配帧。也就是说,它返回给定的&lt;iframe&gt; 元素的ID,或者: 如果给定的元素不是&lt;iframe&gt;,则该函数寻找一个&lt;iframe&gt; 的子元素,并返回该帧的ID。如果框架不存在,该函数会将给定 ID 后缀为-frame
      • players[playerID]` 指的是初始化的播放器实例。

确保您检查this answer,因为这个答案的核心功能就是基于此。

Other YouTube Frame API answers。在这些答案中,我展示了 YouTube Frame/JavaScript API 的各种实现。

【讨论】:

  • 演示您的问题。 jsfiddle.net/KtbYR/3我现在得走了,所以接下来的几个小时我将无法回复。
  • 谢谢 Rob,你的编码给我留下了深刻的印象!顺便说一句 - 为什么将图像绝对定位在视频前面是一种安全措施?好奇。
  • @SparrwHawk 可以将(部分)透明元素/图像放置在第三方框架的前面,并欺骗用户共享不需要的信息。这是一个巨大的潜在安全问题。
  • 还不错,但是在 SEO 等方面没有惩罚?这只是道德上的考虑,对吧?
  • @SparrwHawk 大多数现代浏览器不允许(部分)不可见元素重叠框架。这不是 SEO 或道德方面的惩罚,而是可访问性方面的惩罚。该按钮将永远不可点击,因为 iframe 在它上面。但是:请参阅this answer + 答案中的演示。
猜你喜欢
  • 2014-03-07
  • 1970-01-01
  • 2015-06-24
  • 2014-07-15
  • 1970-01-01
  • 2012-09-14
  • 2018-08-09
  • 2013-10-19
  • 2018-04-28
相关资源
最近更新 更多