`
schy_hqh
  • 浏览: 558217 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

javascript同源策略,实现iframe窗口高度自适应

 
阅读更多

 

domainA 中有一个页面index.html,通过iframe嵌套了domainB中的一个页面other.html

由于other.html页面在iframe中显示,而且其页面内容会动态的增加或减少,现在需要去掉iframe的滚动条

由于javascript同源策略的限制,无法进行跨域操作,使得问题比较棘手

参考了一下网上的做法,引入了一个代理页面,或者叫做中介 agent.html,属于domainA

然后,在domainB 中的other.html中,再使用iframe将agent.html进行嵌套

 

好了,现在情况是这样的:

index.html 使用iframe 嵌套 other.html

other.html 使用iframe 嵌套 agent.html

之所以要引入第3个页面agent.html,就是为了遵守“同源策略”的规则,完成不同domain下参数的传递! 

 

我们最终的目的是要去掉滚动条,又要保证被嵌入的页面内容全部得到显示

1.取得other.html页面的实际高度height

2.将height设置到其嵌入的iframe的src属性上

3.在agent.html中截取出所属iframe的src属性中的height值

 

下面的例子中,使用了一个技巧,避免了使用setInterval()不断去设置iframe的高度

做法是在iframe的src上,附加一个时间戳,让浏览器每次都重新加载agent.html

进而让agent.hml中的js函数invokeMethodInTopWindow()得到执行

 

domainA 中的2个html

index.html

#{extends 'main.html' /}
#{set title:'Home' /}

<hr>

<div style="color:red;font-weight:bold">窗口自适应---绕开同源策略的限制,同时又利用同源策略,去掉iframe的滚动条,动态调整窗口的高度,让其能够显示被嵌套页面的所有内容</div>
<!-- 需要动态调整高度的iframe -->
<div style="text-align:center;">
	<iframe name="domainB" src="http://127.0.0.1:8088/other" width="80%" scrolling="no" frameborder="0"></iframe>
</div>

<script type="text/javascript">
	function resize(height) {
		//alert("resize");
		document.getElementsByName("domainB")[0].height=height;
	}
</script>

 

agent.html

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	我是代理页面哦!
<script type="text/javascript">
	window.onload = invokeMethodInTopWindow; 
	function invokeMethodInTopWindow() {
		//alert("调用同域下的函数,重置iframe的高度");
		var domainA = document.parentWindow;
		var realHeight = domainA.location.hash.split("#")[1];
		//last step:调用最上层窗口的函数,重置iframe的高度 
		parent.parent.resize(realHeight);

		//alert("realHeight:"+realHeight);
		//alert(document.parentWindow.name);//获取容器所在窗口的名称 domainA
		//error://alert(document.parentWindow.parent.name); //访问失败 :不能访问domainB 
		//alert(document.parentWindow.parent.parent.name);//最顶层window属于domainA,因此可以访问
	}
	//使用不同的时间戳设置iframe的src属性后,就不用使用setInterval()
	//setInterval("invokeMethodInTopWindow()",100);
</script>
</body>
</html>

 

 

domainB中的other.html

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body onclick="proxy()">
	<!-- 被A域所嵌入的页面 -->
	<button type="button" onclick="btnClick()">切换显示</button>
	
	<div style="display:none">
		在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。
		这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。
		所谓同源是指,域名,协议,端口相同。
		在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。
		这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。
		所谓同源是指,域名,协议,端口相同。
		在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。
		这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。
		所谓同源是指,域名,协议,端口相同。
		在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。
		这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。
		所谓同源是指,域名,协议,端口相同。
		在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。
		这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。
		所谓同源是指,域名,协议,端口相同。
		在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。
		这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。
		所谓同源是指,域名,协议,端口相同。
		在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。
		这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。
		所谓同源是指,域名,协议,端口相同。
		在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。
		这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。
		所谓同源是指,域名,协议,端口相同。
		在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。
		这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。
		所谓同源是指,域名,协议,端口相同。
	</div>
	<div style="display:block">
		比如一个黑客程序,他利用IFrame把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,
		他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
		比如一个黑客程序,他利用IFrame把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,
		他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
		比如一个黑客程序,他利用IFrame把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,
		他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
		比如一个黑客程序,他利用IFrame把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,
		他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
		比如一个黑客程序,他利用IFrame把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,
		他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
		比如一个黑客程序,他利用IFrame把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,
		他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
		比如一个黑客程序,他利用IFrame把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,
		他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
		比如一个黑客程序,他利用IFrame把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,
		他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
	</div>
	
	<!-- 反向嵌入A域的页面 -->
	<iframe name="domainA" src="" style="display:none"></iframe>
	
	<!-- script -->
	<script type="text/javascript">
		//隐藏或显示div
		function btnClick() {
			var div = document.getElementsByTagName("div");
			for(var i in div) {
				if(i<div.length)				
					div[i].style.display = (div[i].style.display == 'none') ? "block" : "none";
			}
		}
	</script>
	
	<script type="text/javascript">
		function proxy(){
			//alert("btn click");
			//获取本页面的高度 
			var scrollHeight = document.documentElement.scrollHeight;
			//alert("滚动条高度:"+scrollHeight);
			//将窗口的高度先设置到属于domainA的iframe的src属性上 
			var iframeDomainA = document.getElementsByName("domainA")[0];
			//用domainA的一个页面作为代理,最终的目的是解决“同源策略”的限制  
			var url = "http://localhost:9000/agent";
			/**技巧:通过时间戳让浏览器每次重新加载iframe,这样每次都会自动设置被嵌套的iframe的高度,避免了使用setInterval()*/
			iframeDomainA.src = url+ "? time=" + new Date().getTime() + "#" + scrollHeight ;
		}
		
		window.onload = proxy;
		
	</script>
		
</body>
</html>

 

 

分享到:
评论

相关推荐

    js实现iframe自适应高度

    本文将详细讲解如何使用JavaScript实现`iframe`自适应高度的解决方案,确保在各种主流浏览器中都能正常工作。 首先,理解`iframe`的基本结构和属性是至关重要的。`iframe`标签通常包含`src`属性,用于指定要加载的...

    iframe自动适应高度(完美自适应高度嵌套代码),兼容目前主流浏览器。

    2. 同源策略:由于跨域安全限制,只有同源的`iframe`才能访问其内容的高度,否则会出现安全错误。 3. 延迟加载:为了提高页面加载速度,可以考虑使用懒加载策略,即在`iframe`内容真正需要显示时再进行加载和高度...

    iframe跨域高度自适应例子源码

    总的来说,这个例子通过`postMessage`实现了跨域`iframe`的高度自适应,使得`iframe`可以动态地根据其内容的高度进行调整,即使内容源与父页面不在同一域。这在处理第三方内容嵌入或者多个域间的交互时非常有用。...

    iframe窗口高度自适应的又一个巧妙实现思路

    在本文中,我们将探讨一种巧妙的方法来解决在跨域环境下,使用`iframe`实现窗口高度自适应的问题。问题的核心在于,由于JavaScript的同源策略限制,我们无法在不同域名之间直接进行DOM操作或数据交换。为了解决这个...

    iframe跨域嵌套自适应高度

    以下是一个简单的示例,展示了如何使用JavaScript实现`iframe`的自适应高度调整: ```javascript function adjustIFrameHeight(id) { var iframe = document.getElementById(id); var doc = iframe....

    iframe高度自适应

    然而,由于同源策略的限制,跨域的`iframe`无法通过JavaScript获取其内容的高度,这给高度自适应带来了挑战。 **解决方法:** 1. **纯CSS解决方案**: 在某些情况下,如果`iframe`内容与主页面同源,可以使用CSS...

    iframe自适应高度.rar

    【标题】:“iframe自适应高度.rar”涉及到的...总的来说,"iframe自适应高度.rar"这个主题涵盖了iframe的使用、同源策略的理解以及JavaScript实现iframe高度自适应的技术细节,这些都是前端开发中非常实用的知识点。

    iframe跨域自适应高度模板

    总结来说,`iframe`跨域自适应高度模板主要是通过`CORS`解决跨域限制,通过JavaScript监听`load`事件或使用`postMessage`通信来实现内容高度的动态调整。这些技术在现代网页开发中十分常见,能帮助我们更灵活地整合...

    iframe窗口高度自适应的实现方法

    本文主要介绍了一种实现`iframe`窗口高度自适应的方案,它涉及到了跨域、同源策略和动态调整高度的技术点。 1. **跨域问题与同源策略**:JavaScript的安全机制规定,只有同源(协议、域名和端口相同)的页面之间...

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

    `sandbox`属性可以启用或禁用iFrame的一些安全特性,如JavaScript执行,这可能影响到高度自适应的实现。 7. **兼容性处理**: 针对IE7、8、9,可能需要使用特定的JavaScript库或技巧,如jQuery的`.height()`方法...

    解决iframe跨域高度自适应问题的源码

    根据浏览器的同源策略,一个网页只能访问与之同源(即协议、域名和端口完全相同)的资源。而跨域则意味着iframe加载的页面与父页面不在同一源下,这就限制了JavaScript对iframe内容的一些操作,包括获取和设置其高度...

    js实现iframe自动自适应高度的方法

    本篇文章将详细介绍如何使用JavaScript实现Iframe的自动自适应高度。 首先,理解基本概念。Iframe的`height`属性决定了其显示区域的高度,当我们想要Iframe内容自适应时,我们需要动态地修改这个属性值,使其等于...

    再谈iframe自适应高度

    - 另一个问题是跨域问题,由于同源策略的限制,浏览器不允许JavaScript在不同的源之间获取或修改DOM元素,这使得在父页面中动态获取iframe内容的高度变得复杂。 3. **解决方案**: - **JavaScript/jQuery方法**:...

    Iframe高度自适应(兼容IE/Firefox、同域/跨域)

    而跨域则需要考虑浏览器的同源策略限制,为了实现高度自适应,可能需要使用window.postMessage方法进行跨域通信,将Iframe内部的尺寸信息传递给父页面。 5. **源码分析**: - `iframe.html`可能是一个包含了Iframe...

    iframe自适应高度(DOM动态操作)

    ### iframe自适应高度(DOM动态操作) #### 概述 在网页开发中,`iframe`是一种常用的技术,用于在一个HTML页面中嵌入另一个HTML页面。然而,在实际应用中经常会遇到一个问题:即`iframe`的高度与内嵌页面的实际...

    iframe自适应高度js demo

    为了实现`iframe`自适应高度,我们可以利用JavaScript的DOM操作和事件监听。以下是一个简单的JavaScript函数示例,该函数动态地设置`iframe`的高度: ```javascript function setIframeHeight(iframeId) { var ...

Global site tag (gtag.js) - Google Analytics