最近接手了一个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)
?
?