iFrame高度自适应终极解决方案(兼容IE7,8,9 Firefox3.6+,Chrome 12+)

1 篇文章 0 订阅
1 篇文章 0 订阅

最近接手了一个web项目,由于一些很蛋疼的压力迫于无奈使用了iFrame来做页面布局,高度自适应问题自然就被提上台面儿了。在网上找了很多的解决办法无果,要么是干脆无效,要么是iframe首次加载的时候高度ok,用ajax加载几个元素高度撑大了以后就越界了。最后跟公司几个前端请教最终修成正果,闲话少说直接上代码

 

var frameHandler = function() {
	var inner;
	
	var iframeId = "";

	return inner = {
		_isSupport : false,
		init : function() {
			
		},
		create : function(frame) {
			iframeId=frame.id;
			frame.frameBorder = "none";
			frame.scrolling = "no";
			frame.style.marginTop = '40px';
			frame.contentWindow.focus();
			inner.check();
			
			if (inner._isSupport) {
				if (!frame.addEventListener) {
					frame.attachEvent("onload", function() {
						frame.detachEvent("onload", arguments.callee);
						inner.adjustFrameHeight();
						frame.contentWindow.attachEvent("onresize", inner.adjustFrameHeight);						
					});
					
				} else {
					frame.addEventListener("load", function() {
						frame.removeEventListener('load', arguments.callee, false);
						inner.adjustFrameHeight();
						frame.contentWindow.document.documentElement.addEventListener('DOMSubtreeModified', inner.adjustFrameHeight, false);
					}, false);
				}
			} else if (frame.addEventListener) {// for FF 2, Safari 2, Opera 9.6+
					frame.addEventListener("load", function() {
						var fn = arguments.callee;
						setTimeout(function() {
							frame.removeEventListener('load', fn, false);
						}, 100);
						
						inner.adjustFrameHeight();	
						frame.contentWindow.document.documentElement.addEventListener('DOMNodeInserted', inner.adjustFrameHeight, false);
						frame.contentWindow.document.documentElement.addEventListener('DOMNodeRemoved', inner.adjustFrameHeight, false);
					}, false);
			}

		},
		getFrame : function() {
			return document.getElementById(iframeId).contentWindow;
		},
		adjustFrameHeight : function() {
			var elem = document.getElementById(iframeId);

			elem.style.height = Math.max(elem.contentWindow.document.body.scrollHeight, elem.contentWindow.document.documentElement.scrollHeight) + 'px';
		},
		check : function() {
			var remain = 1, 
				doc = document.documentElement, 
				dummy;
			
			if (doc.addEventListener) {
				doc.addEventListener("DOMSubtreeModified", function() {
					inner._isSupport = true;
					doc.removeEventListener("DOMSubtreeModified", arguments.callee, false);
				}, false);
			} else {
				inner._isSupport = true;
				return ;
			}

			dummy = document.createElement("div");
			doc.appendChild( dummy );
			doc.removeChild( dummy );
		}
	}
}();

 关键是对DOMSubtreeModified、DOMNodeInserted、DOMNodeRemoved这几个事件的监听,dom结构有变化的时候也可以自适应了。有需要的尽管拿去吧

附上一个示例(chrome下需要把页面放在apache之类的服务器上才能正常,其他的本地运行也ok)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值