【问题标题】:embedded iframe element not working with youtube iframe api嵌入式 iframe 元素不适用于 youtube iframe api
【发布时间】:2014-01-13 07:27:33
【问题描述】:

这是这个项目的 jsfiddle:http://jsfiddle.net/frankzfaz/bweH4/13/

按下按钮时,我想使用的 iframe 元素通过 javascript 加载到 html 中:

document.getElementById('iframeload').innerHTML = '<iframe id="ytplayer" type="text/html" width="300" height="300" src="https://www.youtube.com/embed/' + metalMusicVid[indexVid].youTubeId + '?enablejsapi=1&modestbranding=1&rel=0&iv_load_policy=3&showinfo=0&controls=0&autoplay=1" frameborder="0" allowfullscreen></iframe>';

如您所见,“metalMusicVid[indexVid].youTubeId”从 js 数组中提取 youtube 视频 ID。这就是我希望它工作的方式。

我希望它与 youtube api 事件侦听器一起工作。如此处所示:

      var tag = document.createElement('script');
  tag.src = "https://www.youtube.com/iframe_api";
  var firstScriptTag = document.getElementsByTagName('script')[0];
  firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

    // youtube player api stuff
    function onYouTubePlayerReady(playerId) {
    var player = document.getElementById("ytplayer");
    player.addEventListener("onStateChange", "onytplayerStateChange");
    player.addEventListener("onError", "onPlayerError");

                    // get current time and display it.
                      setInterval(function(){document.getElementById('vidTime').innerHTML = "Current: " + pad(Math.floor(player.getCurrentTime() / 60)) + ":" + pad(Math.floor(player.getCurrentTime() % 60))}, 1000);
                      // pads number with extra zeros, looking more like a real digital clock
                          function pad(val) {
                              var valString = val + "";
                              if (valString.length < 2) {
                                  return "0" + valString;
                              } else {
                                  return valString;
                              }
                          }
  }


function onytplayerStateChange(newState) {
    //console.log("New state " + newState); 
if(newState === 0){alert('the youtube api is working')}
if(newState === -1){alert('the youtube api is working')}
}

function onPlayerError(errorCode) {
  console.log("New ERROR " + errorCode);
}

这适用于对象嵌入,但我想使用 iframe,因此它更适用于 ipad 和移动设备。不,我不想从 api 本身加载 iframe,如 google 文档中所示,因为每个 video-id 都是从 javscript 数组加载的。

我所需要的只是让这些事件侦听器从它的元素 ID 中获取新的 iframe。

网址:http://jsfiddle.net/frankzfaz/bweH4/13/

【问题讨论】:

    标签: javascript api iframe youtube youtube-api


    【解决方案1】:

    使用 iframe API 时。您不必让 YT.Player 构造函数生成 API ...如果您将现有 iframe 的 ID 或对现有 DOM 元素的引用作为参数传递(并且在任何一种情况下都省略 ' videoId' 参数)然后播放器对象将使用您现有的 iframe 初始化并设置您的所有绑定。所以不要这样:

    function onYouTubePlayerReady(playerId) {
       var player = document.getElementById("ytplayer");
       player.addEventListener("onStateChange", "onytplayerStateChange");
       player.addEventListener("onError", "onPlayerError");
       // ... etc etc etc
    

    你会想要这样的:

    function onYouTubeIframeAPIReady() { // called automatically when the iframe API loads.
      var player = new YT.Player(playerId, { // passing the reference to the DOM element of your existing iframe
        events: {
          'onStateChange': onPlayerStateChange,
          'onError': onPlayerError
        }
      });
    }
    

    【讨论】:

    • 我试过这个,没有运气。可能是因为页面加载时 iframe 不加载,它仅在激活功能时加载(通过 html 按钮)。我是否将“playerId”替换为 iframe id?因为我试过了,没有运气。
    • playerId 可以是 DOM 元素本身(即您使用 document.getElementById 创建的对象),也可以只是您建议的 iframe 的 ID 属性。但是,您是正确的,如果 iframe 本身在激活不同的功能之前不加载,那么此代码将不起作用(因为它在注入代码库后立即运行)。那么,您需要做的是将创建 YT.Player 对象的代码移动到 HTML 按钮触发的任何函数中 - 并确保 iframe 在运行之前已完全加载。
    • 我尝试将函数 onYouTubeIframeAPIReady(){etc...} 放在函数内部,在 iframe 之后。也不行。为什么这不起作用?我应该使用 setTimeout 函数强制 onYouTubeIframeAPIReady() 在函数放置 iframe 后加载吗?
    • 不,你不会想把整个函数放在那里......只要把逻辑放在里面(即在你确定 iframe 存在之后创建 YT.Player 对象)。如果整个函数都在那里,它将永远不会被调用。事实上,您甚至可以尝试颠倒顺序……将创建 iframe 的函数放在 onYouTubeIframeAPIReady 函数中。如果你想用你的整个代码创建一个小提琴,我很乐意看看。
    • 好的,这是小提琴:jsfiddle.net/frankzfaz/bweH4/13 这是嵌入对象的旧代码,但 iframe 嵌入代码在其中,已注释掉。施展你的魔法:)
    猜你喜欢
    • 2022-11-10
    • 1970-01-01
    • 2012-08-22
    • 2016-07-23
    • 1970-01-01
    • 2014-02-02
    • 2011-08-30
    • 2015-10-08
    • 1970-01-01
    相关资源
    最近更新 更多