【发布时间】:2018-01-18 07:34:17
【问题描述】:
看看codepen上的笔:http://codepen.io/
几秒钟后,它们都停止了。如果您检查这些元素,您会发现它们实际上是真正的 iframe,但不知何故,它们设法“暂停”了它们。
这是怎么做的?
【问题讨论】:
看看codepen上的笔:http://codepen.io/
几秒钟后,它们都停止了。如果您检查这些元素,您会发现它们实际上是真正的 iframe,但不知何故,它们设法“暂停”了它们。
这是怎么做的?
【问题讨论】:
由加载的内容完成,见http://codepen.io/rafaelcastrocouto/full/pfxat的来源(第一个的iFrame路径)。
【讨论】:
script 标签。有一个功能可以完成工作(它取消所有 CSS 动画)
我知道这是一个非常古老的帖子,但对于那些在 2018 年仍然好奇的人:
你需要
别担心,它非常简单明了。
以下将查找并遍历 DOM 中呈现的所有节点。对于每个 HTMLElement,它会将 CSS 属性设置为“暂停”。
function disablewebkitAnimations() {
var nodes = document.querySelectorAll('*')
for (var i = 0; i < nodes.length; i++) {
style = nodes[i].style
style.webkitAnimationPlayState = 'paused'
document.body.className = 'paused'
}
}
下面的函数会选择所有type类型的元素,遍历它们并简单地调用pause()方法。
function pauseElementTypes(type) {
let nodes = document.querySelectorAll(type)
for (var i = 0, els = document.getElementsByTagName(type); i < els.length; i++) {
els[i].pause();
}
}
注意:这将不会停止未在 DOM 中呈现的音频和视频元素。这意味着如果您创建一个新的 HTMLAudioElement 然后播放它但不将其附加到您的文档中,它将继续播放。这就是为什么 CodePen 上的一些笔在结果中有时仍能发出声音的原因。
一个简单的函数,可以完成我们刚才描述的所有事情。
function iFrameDisable() {
disablewebkitAnimations()
pauseElementTypes("audio")
pauseElementTypes("video")
}
setTimeout(iFrameDisable, 4000) // execute after 4 seconds
基本上,在 CodePen 上,他们在搜索结果的每个 iFrame 中注入以下代码。 (函数名称可能不同,但概念上是相同的)
<script>
function disablewebkitAnimations() {
var nodes = document.querySelectorAll('*')
for (var i = 0; i < nodes.length; i++) {
style = nodes[i].style
style.webkitAnimationPlayState = 'paused'
document.body.className = 'paused'
}
}
function pauseElementTypes(type) {
let nodes = document.querySelectorAll(type)
for (var i = 0, els = document.getElementsByTagName(type); i < els.length; i++) {
els[i].pause();
}
}
function iFrameDisable() {
disablewebkitAnimations()
pauseElementTypes("audio")
pauseElementTypes("video")
}
setTimeout(iFrameDisable, 4000)
</script>
阅读更多关于开发者disabling iFrames 的信息。
【讨论】: