访问 iFrame 中的元素

Accessing element within iFrame

我需要获取我在 iFrame 中播放的 YouTube 视频的当前时间,但无法从我的脚本访问该视频。

在浏览器开发工具中选择视频后,我可以毫无问题地使用 console.alert($("#player").children[0].getCurrentTime())

但是,当相同的代码来自脚本 运行 时,我得到 TypeError: Cannot read property 'getCurrentTime' of undefined

SO 上的

This post 让我认为如果未打开开发工具,它与被隐藏的元素有关。然而$("#player").children[0].removeClass("hidden")returnsTypeError: $(...).contents is not a function at <anonymous>。该元素似乎不存在。

下面是完整代码,其中 90% 直接来自第一个 iframe 示例 here

<!DOCTYPE html>
<html>
<body>
<!-- 1. The <iframe> (and video player) will replace this <div> tag. -->
<div id="player"></div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

<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: '390',
            width: '640',
            videoId: 'U03lLvhBzOw',
            events: {
                'onReady': onPlayerReady
            }
        });
    }

    // 4. The API will call this function when the video player is ready.
    function onPlayerReady(event) {
        event.target.playVideo();
        console.alert($("#player").children[0].getCurrentTime()) //DOESN'T WORK
    }

</script>
</body>
</html>

您无法更改 iFrame 中的内容,除非 iframe 与您的父级来自同一域。这就是查询结果为您 undefined.

的原因

请参阅此 post 以了解有关此问题的更多详细信息。

Override body style for content in an iframe

使用 iFrame 的简单规则是,只有当它来自同一个 host/origin。

时,您才能访问其中的内容

这是所有浏览器在安全方面的标准行为。 最重要的是,如果来自不同的域,则无法直接访问 iFrame 的内容。

在这种情况下,我看到的唯一解决方案是,因为您是使用 Youtube API 创建的,只需将您创建的播放器对象缓存到 var,然后在控制台中探索其中的方法

您已经拥有 YouTube 播放器的 var 对象,因此无需导航 DOM。

例如:

// Play the video
function onPlayerReady(event) {
    player.playVideo();
    console.log(player.getCurrentTime());

    // Jump to 10 seconds
    player.seekTo(10);

    // Stop the video after 3 seconds
    setTimeout(stopVideo, 3000);
}

function stopVideo() {
    console.log(player.getCurrentTime());
    player.stopVideo();
}

我用 DOM 来完成这项工作。这在与 Vimeo 视频播放接口时变得至关重要,其中 iframe 根本不会有 id,但它之外的 DIV 有。为了控制视频的播放,只好把iframe弄到里面了。

我想您可以在 YouTube 上做类似的事情。对我来说,Vimeo 是重点。

<div id="260309722" name="260309722" class="hook">
<iframe  src="https://player.vimeo.com/video/260309722" width="500" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
</div>

<script>
var tmp          = document.getElementById("260309722").querySelectorAll("iframe"); 
var iframe       = tmp[0];          // grab the iframe inside

VideoControl(iframe, TeaserLen);

function VideoControl(iframe, TeaserLen)
{
var Videoplayer  = new Vimeo.Player(iframe);
    Videoplayer.on('timeupdate', function(progress) {
var Progress = progress.percent * 100;
var Playtime = progress.seconds;
var Playtime2 = Videoplayer.getCurrentTime();
  
   if (Playtime >= TeaserLen)
   {
     var bPaused = Playtime2;   
     Videoplayer.pause();

    // do something else
   }            //  if (Playtime >= TeaserLen)
 });            // Videoplayer.on('timeupdate', function(progress)
}               // function VideoControl(iframe, TeaserLen)
</script>