我在页面中加载iframe,iframe的内容长度会不时更改 . 我已经实现了以下解决方案 . 但是高度是固定的,因为dyniframesize只在iframe.onload时调用 .
可以相应地调整iframe的大小,以便iframe的高度发生变化吗?
<iframe src ="popup.html" frameborder="0" marginheight="0" marginwidth="0" frameborder="0" scrolling="auto" id="ifm" name="ifm" onload="javascript:dyniframesize('ifm');" width="100%"></iframe>
function dyniframesize(down) {
var pTar = null;
if (document.getElementById){
pTar = document.getElementById(down);
}
else{
eval('pTar = ' + down + ';');
}
if (pTar && !window.opera){
//begin resizing iframe
pTar.style.display="block"
if (pTar.contentDocument && pTar.contentDocument.body.offsetHeight){
//ns6 syntax
pTar.height = pTar.contentDocument.body.offsetHeight +20;
pTar.width = pTar.contentDocument.body.scrollWidth+20;
}
else if (pTar.Document && pTar.Document.body.scrollHeight){
//ie5+ syntax
pTar.height = pTar.Document.body.scrollHeight;
pTar.width = pTar.Document.body.scrollWidth;
}
}
}
</script>
5 回答
实际上你应该通过访问父窗口和更改iframe的高度来从iframe中做到这一点 .
因为iframe中的文档通常更好地知道它的主体是否改变了它的大小(你实际上可以将它绑定到像body.onload这样的东西而不是使用间隔来检查iframe中是否有变化) .
据我所知,没有一种非常自然的方法,但有一些选择 .
setInterval()
您可以使用
setInterval()
重复检查iframe的内容高度,并根据需要进行调整 . 这很简单,但效率低下 .事件监听器
例如,iframe中的内容的任何更改都会从iframe外部添加内容,而"add"可能是由按钮点击触发的 . 这可能适合您:Live demo here (click).
变异观察者
此解决方案适用于所有最新的浏览器 - http://caniuse.com/mutationobserver
Live demo here (click).
这很简单,应该 grab 相关的变化 . 如果没有,您可以将它与上面的事件监听器解决方案结合起来,以确保更新内容!
荣誉奖:溢出/下溢事件 .
Read about it here(有很多东西) .
和see my demo here(在IE 11中不起作用!) .
这个 was 是一个很酷的解决方案,但它使用上述解决方案之一,即使我不得不为旧浏览器回退1秒
setInterval
,只是因为它比这个解决方案简单得多 .我编写了一个使用mutationaObserver和eventListners的小型库,其后退为IE8-10的setInterval,适用于同一域和跨域 . 它可以调整高度和宽度 .
http://davidjbradshaw.github.io/iframe-resizer/
iFrame视图
主视图
您可以使用自定义事件在
iframe
和父级之间发送信号 .在
iframe
:然后,在父母: