iframe跨域高度自適應(動態調整),動態監聽跨域子頁面高度的改變而改變iframe高度,去除醜陋的滾動條

目的:系統A的indexA.html頁面,用iframe的形式集成系統B的indexB.html頁面

方法1:使用使用 HTML5 postMessage。(強烈推薦)

postMessage可以實現跨文檔消息傳輸(Cross Document Messaging),Internet Explorer 8, Firefox 3, Opera 9, Chrome 3和 Safari 4都支持postMessage。

indexA.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>系統A - 主頁</title>
	</head>
	<body>
		<iframe class="cross-iframe" id="crossIframe" frameborder="no" scrolling="no" width="100%" src="http://localhost:8848/webtest/page/indexB.html">
			
		</iframe>
		<script type="text/javascript">
			window.onload = function(){
				window.addEventListener('message',function(event){
					if(event.origin == "http://localhost:8848") {
						document.getElementById('crossIframe').style.height = event.data + "px";
					}
				})
			}
		</script>
	</body>
</html>

indexB.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>系統B - 主頁</title>
	</head>
	<body>
		<div style="background-color: #0000FF;" id="test">
			<input type="number" value="300" id="test_input"/>
		</div>
		<script src="https://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
		<script src="https://cdn.bootcss.com/jquery-resize/1.1/jquery.ba-resize.js"></script>
		<script type="text/javascript">
			//改變頁面高度
			$("#test_input").on("change",function(){
				$("#test").height($(this).val());
			});
			$('body').resize(function(){
				var h = document.body.scrollHeight;
				window.parent.postMessage(h, "http://127.0.0.1:8848");	
			});
		</script>
	</body>
</html>

方法2:使用iFrame Resizer插件

indexA.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>系統A - 主頁</title>
	</head>
	<body>
		<iframe class="cross-iframe" id="crossIframe" frameborder="no" scrolling="no" width="100%" src="http://localhost:8848/webtest/page/indexB.html">
			
		</iframe>
		<script src="../js/jquery.min.js" type="text/javascript" charset="utf-8"></script>
		<script src="../js/iframeResizer/iframeResizer.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			$('#crossIframe').iFrameResize({});
		</script>
	</body>
</html>

indexB.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>系統B - 主頁</title>
	</head>
	<body>
		<div style="background-color: #0000FF;" id="test">
			<input type="number" value="300" id="test_input"/>
			<button type="button" id="test_btn">提交</button>
		</div>
		<script src="../js/jquery.min.js" type="text/javascript" charset="utf-8"></script>
		<script src="../js/iframeResizer/iframeResizer.contentWindow.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			$("#test_btn").click(function(){
				$("#test").height($("#test_input").val());
			});
		</script>
	</body>
</html>

方法3:使用代理頁面實現

由於域名不同導致跨域,A系統的頁面(以下A系統頁面簡稱A頁)無法獲取和操作B系統頁面(以下B系統頁面簡稱B頁)元素,所以B頁需要首先用iframe嵌入A系統的一個頁面例如:cross.html,然後B頁將自身的高度當做hash值設置到iframe的src中,然後由於cross.html獲取自身url上的hash中B頁的高度,並將其賦值給A中的iframe。(這裏需要說明一下,由於cross.html與indexA.html同屬於A系統,所以可以獲取並操作A頁面的元素,獲取方式如:window.parent.parent.document.getElementsByTagName("iframe")(::獲取父窗口的父窗口中的所有iframe元素)),代碼樣例如下:

indexA.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>系統A - 主頁</title>
	</head>
	<body>
		<iframe class="cross-iframe" frameborder="no" scrolling="no" width="100%" src="http://localhost:8848/webtest/page/indexB.html">
			
		</iframe>
	</body>
</html>

indexB.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>系統B - 主頁</title>
	</head>
	<body>
		<div style="background-color: #0000FF;" id="test">
			<input type="number" value="300" id="test_input"/>
		</div>
		<script src="https://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
		<script src="https://cdn.bootcss.com/jquery-resize/1.1/jquery.ba-resize.js"></script>
		<script type="text/javascript">
			//改變頁面高度
			$("#test_input").on("change",function(){
				$("#test").height($(this).val());
			});
			// 監聽body高度變化,並將變化後的高度設置到iframe路徑中去
			var iframeId = 'iframe_' + new Date().getTime();
			$('body').resize(function(){
			  $("#" + iframeId).length>0 && $("#" + iframeId).detach();
			  var b_width = document.body.scrollWidth;
			  var b_height = document.body.scrollHeight;
			  var iframe = document.createElement('iframe');
			  iframe.src="http://127.0.0.1:8848/webtest/page/cross.html"+ "#" + b_width + "|" + b_height + "|" + iframeId;
			  iframe.style.display="none";
			  iframe.id = iframeId
			  document.body.appendChild(iframe);
			});
		</script>
	</body>
</html>

cross.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>跨域集成頁</title>
	</head>
	<body>
		<script type="text/javascript">
			// 獲取到當前路徑上的hash值,並將其賦值給父窗口所在的iframe
		    window.onload =function (ev) {
		        var hash_url = window.location.hash;
		        if(hash_url.indexOf("#")>=0){
		            var hash_width = hash_url.split("#")[1].split("|")[0]+"px";
		            var hash_height = hash_url.split("#")[1].split("|")[1]+"px";
		            var hash_id = hash_url.split("#")[1].split("|")[2];
		            var iframes =window.parent.parent.document.getElementsByTagName("iframe");
		            for(var i=0;i<iframes.length;i++){
		                var currIframe = iframes[i];
		                if(currIframe.className.indexOf("cross-iframe")>-1 && !currIframe.id){
		                    currIframe.style.height = hash_height;
		                    currIframe.id=hash_id;
		                }else if(currIframe.className.indexOf("cross-iframe")>-1 && currIframe.id==hash_id){
		                    currIframe.style.height = hash_height;
		                }
		            }
		        }
		    }
		</script>
	</body>
</html>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章