浅谈获取DOM跨域的解决方案——document.domain、window.name、window.postMessage

如果两个网页不同源,就无法拿到对方的DOM。典型的例子是iframe窗口和window.open方法打开的窗口,它们与父窗口无法通信。


获取DOM的跨域解决方案:

(1)如果两个窗口一级域名相同,只是二级域名不同,那么设置document.domain属性,即可跨域获取DOM。

例如,可以在http://www.msnova.net/a.html和http://blogs.msnova.net/b.html两个文件中分别加上document.domain = “msnova.net”;然后通过a.html文件中创建一个iframe,去控制iframe的contentDocument,这样两个js文件之间就可以“交互”了。这种办法只能解决主域相同而二级域名不同的情况。

http://blogs.msnova.net/b.html

document.domain = "msnova.net";

http://www.msnova.net/a.html

document.domain = "msnova.net";
var ifr = document.createElement('iframe');
ifr.src = 'http://blogs.msnova.net/b.html';
ifr.style.display = 'none';
document.body.appendChild(ifr);
ifr.onload = function(){
	var x = ifr.contentDocument;
	alert(x.getElementsByTagName("h1")[0].childNodes[0].nodeValue); //操作b.html
	ifr.onload = null;
}


(2)否则,可以通过window.name和window.postMessage跨域获取DOM

2-1)window.name

http://JavaScript.exam.com/text.html:

<!DOCTYPE html>  
<html>  
    <head>  
    </head>  
    <body>  
        <script>  
		window.name = "value";		
	</script>  
    </body>  
</html>
http://catagory.exam.com/text.html:
<!DOCTYPE html>
<html>
	<head>
	</head>
	<body>
		<iframe id="iframe" οnlοad="loading()" src="http://javascript.exam.com/text.html"></iframe>
		<script>
			var load = false;
			function loading() {
				if (load == false) {
					// 同域处理,请求后会再次重新加载iframe
					document.getElementById('iframe').contentWindow.location = 'http://catagory.exam.com/index.html';
					load = true;
				} 
				else {
					// 获取window.name的内容,注意必须进行同域处理后方可访问!
					alert(document.getElementById('iframe').contentWindow.name); //输出:value
					load = false;
				}
			}
		</script>
	</body>
</html>


2-2)window.postMessage

http://catagory.exam.com/text.html:

<!doctype html>
<html>
	<head>
	</head>
	<body>
		<iframe id="iframe" src="http://JavaScript.exam.com/Test/text.html"></iframe>
		<script>
			window.onload = function() { 
				document.getElementById('iframe').contentWindow.postMessage('Hello', "http://JavaScript.exam.com");  
			};  
		</script>
	</body>
</html>
http://JavaScript.exam.com/text.html:
<!DOCTYPE html>  
<html>  
    <head>  
        <title></title>  
    </head>  
    <body>  
        <script>  
			window.addEventListener('message', function(event){  
				// 通过origin属性判断消息来源地址  
				if (event.origin == 'http://catagory.exam.com') 
					alert(event.data); //输出:Hello 
			}, false);  	
		</script>  
    </body>  
</html>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值