如何定位“隐藏”的 iframe?(应用程序:链接到嵌入“隐藏的海报图像”嵌入的 Youtube 视频的起始位置)

How to target "hidden" iframes? (application: links to starting positions of a "poster image hidden"-embedded Youtube video)

本文关键字:隐藏 海报 位置 图像 视频 Youtube 应用程序 定位 何定位 iframe 链接      更新时间:2023-09-26
Meta:关于本地存储的A/V

文件的类似问题可以在这里找到:可点击的"定位"超链接到A/V(本地存储在您的网站上并"隐藏"在海报图像后面(。


亲爱的来自 Stackoverflow 社区的人们,

应用程序

我有一个iframe <iframe name="video"..,它被命名为video,它被视为某个视频的"主要播放器"。

由于我还没有能够获得这个视频的交互式成绩单,所以我使用:<a href="//www.youtube.com/embed/...&start=60" target="video">1:00</a>调用视频中的不同播放/起始位置,例如第二个 60。

<iframe name="video"..已经"活动"时,这工作正常:然后链接在 iframe 内移动视频的播放位置。这太好了!

但是,当<iframe name="video"..尚未"活动"时,它无法正常工作,情况就是如此:然后链接然后在不同的浏览器选项卡中打开,而不是在 iframe 内部(或 iframe 应该显示的位置(。

我所说的隐藏是什么意思

我的意思是iframe不"活动"如下:它通过以下代码"隐藏"在"海报图像"后面:

<div onclick="play();" id="vid" style="...; background: ... url('...poster.image.url...') no-repeat center;-webkit-background-size: cover; ...;overflow:hidden"></div>

<script type="text/javascript">function play(){document.getElementById('vid').innerHTML = '<iframe name="video" ... src="//www.youtube.com/embed/...?&...start=0"></iframe>';}</script>


换句话说:我特别想要"<a target="_blank""行为。我想target="video"现在无法正常工作,因为 iframe "隐藏"在海报图像后面。

我确信当 iframe 根本不会隐藏时,这种行为不会发生。我对此进行了多次测试。此外,使用当前的"隐藏"海报功能,当首先单击海报图像(在单击<a href="...></a>之前(时,也不会发生此行为。

如果你想亲眼看到这种行为,你可以在我的网站上看到它。最好的是查找/CTRL-F的">stef",然后打开▾̲ ̲u̲n̲d̲e̲r̲l̲i̲n̲e̲d̲ ̲t̲o̲g̲g̲l̲e̲,你会在那里找到。

那么如何在不打开新的浏览器窗口/选项卡的情况下成功"定位"隐藏"的iframe呢?

任何帮助将不胜感激。非常感谢,文森特·维尔海恩。

好吧,我们来了!小提琴

.HTML

您的html将包含外观和跳线,以完成您要求的内容。

    什么是门面?

立面:">建筑物的主要正面,面向街道或开放空间。

这将是您播放视频或单击任何跳线之前显示的图像,它的 html 将如下所示:

<div class="videoFacade" data-name="video1" data-video="ByJFdTFEwF4" data-start="8">
    <img src="http://i.imgur.com/xeUiWGn.png" />
</div>

    什么是跳线?

跳线是一个锚点,它将 iframe 的 url 更新到视频中的所需时间,它看起来像这样:

JavaScript

window.addEventListener("load", initVideoFacade);
function initVideoFacade() {
    var allFacades = document.querySelectorAll(".videoFacade");
    for (var i = 0; i < allFacades.length; i++) {
        var facade = allFacades[i];
        setUpFacade(facade);
    }
    var allJumpers = document.querySelectorAll(".videoJumper");
    for (var i = 0; i < allJumpers.length; i++) {
        var jumper = allJumpers[i];
        setUpJumper(jumper);
    }
}
function setUpJumper(jumper) {
    jumper.addEventListener("click", function (e) {
        e.preventDefault();
        jumpTo(jumper);
        var video = jumper.dataset.video;
        var facade = getFacadeByVideo(video);
        if (facade) playVideo(facade);
        return false;
    });
}
function setUpFacade(facade) {
    facade.addEventListener("click", function () {
        playVideo(facade);
    });
}
function getFacadeByVideo(video) {
    return document.querySelector(".videoFacade[data-name=" + video + "]");
}
function getIframeByVideo(video) {
    return document.querySelector(".videoIframe[data-name=" + video + "]");
}
function updateVideoSource(iframe, start, end) {
    var iframeSrc = iframe.src.replace(/start=[0-9]+/i, "start=" + start);
    var hasEnd = iframeSrc.indexOf("end") != -1;
    if (hasEnd) iframeSrc = iframeSrc.replace(/end=[0-9]+/i, "end=" + end);
    else iframeSrc += "&end=" + end;
    return iframeSrc;
}
function updateFacadeData(facade, start, end) {
    facade.setAttribute("data-start", start);
    facade.setAttribute("data-end", end);
}
function jumpTo(jumper) {
    var start = jumper.dataset.start;
    var end = jumper.dataset.end;
    var video = jumper.dataset.video;
    var iframe = getIframeByVideo(video);
    if (iframe) {
        var iframeSrc = updateVideoSource(iframe, start, end);
        iframe.src = iframeSrc;
    } else {
        var facade = getFacadeByVideo(video);
        updateFacadeData(facade, start, end);
    }
}
function playVideo(facade) {
    var start = facade.dataset.start || 0;
    var end = facade.dataset.end;
    var name = facade.dataset.name;
    var video = facade.dataset.video;
    var iframe = document.createElement("iframe");
    iframe.dataset.name = name;
    iframe.className = "videoIframe";
    var iframeSrc = "http://www.youtube.com/embed/" + video + "?&cc_load_policy=1&modestbranding=1&autoplay=1&rel=0&showinfo=0&theme=light&start=" + start;
    if (end) iframeSrc += "&end=" + end;
    iframe.src = iframeSrc;
    iframe.frameBorder = 0;
    replaceNode(facade, iframe);
}
function replaceNode(node1, node2) {
    var parent = node1.parentNode;
    var next = node1.nextSibling;
    parent.insertBefore(node2, next);
    parent.removeChild(node1);
}

这是一个时间表:

  • 我们将 initVideoFacade() 方法添加到页面中的 load 事件中,这将确保我们所有的立面和跳线在执行任何操作之前都已启动并运行。

  • initVideoFacade()方法将找到所有跳线和立面,并使用setUpFacade()setUpJumper()方法对其进行设置。

  • setUpJumper() 方法将在跳线上添加一个click event,并告诉它跳转到视频中指定的确定时间,在跳线中指定。此外,如果视频尚未播放,它将立即播放。

  • jumpTo()方法将使用几个regular expressions更新 iframe 的 src(如果视频未播放,则更新外观初始数据(,以替换 iframe src 的&start=&end=部分。

  • setUpFacade()方法将简单地播放视频,删除外观并插入 iframe。

  • playVideo() 方法将从外观创建一个新的 iframe,替换它并将其源、开始和结束时间分配给视频。

.CSS

这只处理立面和 iframe :)的样式

.videoFacade, .videoIframe {
    position: relative;
    width: 360px;
    height: 202.5px;
    margin:5px;
}
.videoFacade {
    cursor: pointer;
    border:1px solid black;
}
.videoFacade img {
    position: absolute;
    width: 50px;
    height: 50px;
    left: 50%;
    top: 50%;
    margin: -25px 0 0 -25px;
}

希望它有帮助!