我正在尝试动态调整 iframe 的大小以适应其内容。为此,我有一段代码:
$("#IframeId").height($("#IframeId").contents().find("html").height());
它不起作用。是因为跨域问题吗?我怎样才能让它适合?请看 Fiddle:JsFiddle
ps 我已经设置了链接的html和bodyheight:100%;
我正在尝试动态调整 iframe 的大小以适应其内容。为此,我有一段代码:
$("#IframeId").height($("#IframeId").contents().find("html").height());
它不起作用。是因为跨域问题吗?我怎样才能让它适合?请看 Fiddle:JsFiddle
ps 我已经设置了链接的html和bodyheight:100%;
你只需要在 iframeload
事件上应用你的代码,所以当时高度是已知的,代码如下:
$("#IframeId").load(function() {
$(this).height( $(this).contents().find("body").height() );
});
请参阅工作演示。此演示适用于 jsfiddle,因为我已将 iframe url 设置为与 jsfiddle 结果 iframe 相同域中的 url,即fiddle.jshell.net
域。
更新:
@Youss:您的页面似乎出于奇怪的原因没有正确设置正文高度,因此请尝试使用主要元素的高度,如下所示:
$(document).ready(function() {
$("#IframeId").load(function() {
var h = $(this).contents().find("ul.jq-text").height();
h += $(this).contents().find("#form1").height();
$(this).height( h );
});
});
不知道为什么@Nelson 的解决方案在 Firefox 26 (Ubuntu) 中不起作用,但以下 Javascript-jQuery 解决方案似乎在 Chromium 和 Firefox 中起作用。
/**
* Called to resize a given iframe.
*
* @param frame The iframe to resize.
*/
function resize( frame ) {
var b = frame.contentWindow.document.body || frame.contentDocument.body,
cHeight = $(b).height();
if( frame.oHeight !== cHeight ) {
$(frame).height( 0 );
frame.style.height = 0;
$(frame).height( cHeight );
frame.style.height = cHeight + "px";
frame.oHeight = cHeight;
}
// Call again to check whether the content height has changed.
setTimeout( function() { resize( frame ); }, 250 );
}
/**
* Resizes all the iframe objects on the current page. This is called when
* the page is loaded. For some reason using jQuery to trigger on loading
* the iframe does not work in Firefox 26.
*/
window.onload = function() {
var frame,
frames = document.getElementsByTagName( 'iframe' ),
i = frames.length - 1;
while( i >= 0 ) {
frame = frames[i];
frame.onload = resize( frame );
i -= 1;
}
};
这会不断调整给定页面上所有 iframe 的大小。
使用jQuery 1.10.2测试。
使用$('iframe').on( 'load', ...
只会间歇性地工作。请注意,如果要在某些浏览器0
中缩小到默认高度以下,则必须首先将大小设置为高度像素。iframe
您可以执行以下操作:
在 iFrame 中使用 document.parent.setHeight(myheight) 将 iFrame 中的高度设置为父级。这是允许的,因为它是一个子控件。从父级调用函数。
在父级中,您创建了一个调整 iFrame 大小的函数 setHeight(iframeheight)。
只需在 HTML 标记上执行,即可完美运行
$("#iframe").load(function() {
$(this).height( $(this).contents().find("html").height() );
});
作为问题的答案,使用已经过时的 jquery(load 已被弃用并替换为 .on('load',function(){}),下面是问题答案的最新代码。
请注意,我使用 scrollHeight 和 scrollWidth,我认为这将比使用提供的答案的 Height 和 Width 加载得更好。它将完全适合,不再滚动。
$("#dreport_frame").on('load',function(){
var h = $('#dreport_frame').contents().find("body").prop('scrollHeight');
var w = $('#dreport_frame').contents().find("body").prop('scrollWidth');
$('#dreport_frame').height(h);
$('#dreport_frame').width(w);
})
最后,我提供了这个跨域解决方案,它也适用于调整大小......(调整大小不触发:当 iframe 内容的高度发生变化时自动调整 iframe 高度(相同域))
框架:
(function() {
"use strict";
var oldIframeHeight = 0,
currentHeight = 0;
function doSize() {
currentHeight = document.body.offsetHeight || document.body.scrollHeight;
if (currentHeight !== oldIframeHeight) {
console.log('currentHeight', currentHeight);
window.parent.postMessage({height:currentHeight}, "*");
oldIframeHeight = currentHeight;
}
}
if (window.parent) {
//window.addEventListener('load', doSize);
//window.addEventListener('resize', doSize);
window.setInterval(doSize, 100); // Dispatch resize ! without bug
}
})();
父页面:
window.addEventListener('message', event => {
if (event.origin.startsWith('https://mysite.fr') && event.data && event.data.height) {
console.log('event.data.height', event.data.height);
jQuery('#frameId').height(event.data.height + 12);
}
});
Adjust height of an iframe, on load and resize, based on its body height.
var iFrameID = document.getElementById('iframe2');
var iframeWin = iFrameID.contentWindow;
var eventList = ["load", "resize"];
for(event of eventList) {
iframeWin.addEventListener(event, function(){
if(iFrameID) {
var h = iframeWin.document.body.offsetHeight + "px";
if(iFrameID.height == h) {
return false;
}
iFrameID.height = "";
iFrameID.height = iframeWin.document.body.offsetHeight + "px";
}
})
}