降域
在当前页面下的
iframe
的域名若与当前页面的域名不同源,则当前页面的js代码对iframe
无法进行任何操作。
原因:这是为了保护用户在iframe
中登录其他网站或与之类似的相关操作会泄露隐私数据
如http://a.example.dir
和http://b.example.dir
,后面的example.dir
相同,那么就可以使用document.domain将二者的域名设置为example.dir来实现同源。
- 顶级域名无法降域
- 不仅当前页面要使用document.domain,iframe的源页面也要使用document.domain
降域主要针对于当前页面下的iframe
修改host文件使得不同域名映射至同一个IP地址,即可测试JSONP跨域
现在假设在http://a.example.dir/a.html
页面里有一个iframe,src是http://b.example.dir/b.html
,这个页面与它里面iframe框架是不同域的,所以我们无法通过页面中JS代码来读取iframe。
<script>
function onload() {
var iframe = document.getElementById("iframe");
var win = iframe.contentWindow; // 这里能够获取到iframe里的window对象,但是不可用
var doc = win.document; // 这里获取不到iframe里的document对象
var name = win.name; // 这里获取不到window对象的name属性
}
</script>
<iframe id="iframe" src="http://b.example.com:8080/b.html" onload="onload()"></iframe>
</body>
但是我们可以使用document.domain,我们只要把http://a.example.com/a.html
和http://b.example.com/b.html
这两个页面的document.domain都设成相同的域名就可以了。
在http://a.example.com/a.html
中设置document.domain
<iframe id="iframe" src="http://b.example.com/b.html" onload="domain()"></iframe>
<script>
document.domain = "example.com"; // 设置成主域
function domain() {
console.log(document.getElementById("iframe").contentWindow);
}
</script>
document.domain的设置是有限制的,我们只能把document.domain设置成自身或更高一级的父域,且主域必须相同。例如:
a.b.example.com
中某个文档的document.domain
可以设成a.b.example.com
、b.example.com
、example.com
中的任意一个,但是不可以设成c.a.b.example.com
,因为这是当前域的子域,也不可以设成baidu.com
,因为主域已经不相同了。
作者:范小饭_
链接:https://www.jianshu.com/p/c71c20e98f94
postMessage
window.postMessage
html5跨域通信之postMessage的用法
实现两个窗口通信方法-postMessage
网友评论