如何定位“隐藏”的 iframe?(应用程序:链接到嵌入“隐藏的海报图像”嵌入的 Youtube 视频的起始位置)
How to target "hidden" iframes? (application: links to starting positions of a "poster image hidden"-embedded Youtube video)
文件的类似问题可以在这里找到:可点击的"定位"超链接到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;
}
希望它有帮助!
- 在单击任何位置时隐藏元素,而不检查每次DOM单击
- 显示5秒后隐藏潜水
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 剑道UI内联编辑:如何在点击其他按钮时隐藏按钮
- 浮动页脚栏-使用Bootstrap隐藏
- 在jquery中为显示/隐藏设置cookie
- 单击按钮后如何逐个调用分区,上一个分区将隐藏
- 从var向代码隐藏函数传递值
- Image赢得't隐藏在滚动jQuery上
- 具有rowGrouping的数据表无法隐藏列
- Jquery隐藏未触发
- JavaScript 检查隐藏字段中的值并将其设置为隐藏字段值
- 分部隐藏在jquery中不起作用
- 点击后隐藏潜水?(但如果Div是一面旗帜呢?)
- javascript.点击隐藏事件故障
- 禁用(而不是隐藏)浏览器滚动条
- PHP Javascript显示/隐藏按钮不工作
- 在mvc应用程序中,在回发时保留最初隐藏的文本框的隐藏或可见状态
- 如何通过溢出来判断元素被切断了多少像素:隐藏在父级上
- 如何定位“隐藏”的 iframe?(应用程序:链接到嵌入“隐藏的海报图像”嵌入的 Youtube 视频的起始位置)