js iframe跨域访问
Posted 快饿死的鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js iframe跨域访问相关的知识,希望对你有一定的参考价值。
URL | 说明 | 是否跨域 |
http://www.a.com/a.js http://www.a.com/b.js |
同protocol,domain,port | 允许 |
http://www.a.com/a/a.js http://www.a.com/b/b.js |
同protocol,domain,port,不同文件夹 | 允许 |
http://www.a.com:8000/a.js http://www.a.com/b.js |
同protocol,domain,不同port(默认port:80) | 不允许 |
http://www.a.com/a.js https://www.a.com/b.js |
同domain,port,不同protocol | 不允许 |
http://www.a.com/a.js http://192.168.82.45/b.js |
同protocol,port,不同domain | 不允许 |
http://www.a.com/a.js http://child.a.com/b.js |
主域相同(a.com),子域不同(www,child) | 不允许 |
http://www.a.com/a.js http://a.com/b.js |
一级域名相同,二级域名不同(同上) | 不允许 |
http://www.a.com/a.js http://www.b.com/b.js |
同protocol,port,不同domian | 不允许 |
1.动态创建script标签
<!-- morningstar.com/parent.html --> <iframe id="ifr" src="http://test.morningstar.com/MarketBarometer/html/test.html" width="200px"></iframe> <script>document.domain = \'morningstar.com\'; functionaa(str){ console.log(str); } window.onload = function(){ document.getElementById(\'ifr\').contentWindow.bb(\'aaa\'); } </script> <!--test.morningstar.com/test.html --><script>document.domain = \'morningstar.com\'; functionbb(str){ console.log(str); } parent.aa(\'bbb\'); </script>
3.通过HTML5 postMessage
.postMessage(message,targetOrigin)参数说明
message: 是要发送的消息,类型为 String、Object (IE8、9 不支持)
targetOrigin: 是限定消息接收范围,不限制请使用 \'*\'
\'message\',function(e)回调函数第一个参数接受Event对象,有三个常用属性:
data: 消息
origin: 消息来源地址
source: 源 DOMWindow 对象
一个简单的父页面qsstage.morningstar.com/parent.html 和子页面 test.com/test.html建立通信
<!-- qsstage.morningstar.com.com/parent.html --><iframeid="ifr"src="http://bar.com/b.html"></iframe><script>window.onload = function(){
var ifr = document.querySelector(\'#ifr\');
ifr.contentWindow.postMessage({a: 1}, \'*\');
}
window.addEventListener(\'message\', function(e){
console.log(\'bar say: \'+e.data);
}, false);
</script>
<!-- test.com/test.html -->
window.addEventListener(\'message\', function(e){
console.log(\'foo say: \' + e.data.a);
e.source.postMessage(\'get\', \'*\');
}, false)
一个简单的父页面chart.com/parent.html 和子页面 test.com/child.html建立通信,通过chart.com/poxy.html实现跨域访问
<!-- chart.com/parent.html --> <iframe id="test1" src="http://test.com/test.html" width="100%" height="200px"></iframe> <script> function callback(data) { console.log(data); } </script>
<!-- chart.com/poxy.html --> <script type="text/javascript"> window.onload = function () { var data = location.hash.substr(1); data = eval("(" + decodeURIComponent(data) + ")"); top.document.getElementById("test1").style.height = data.height + \'px\'; //调用父页面方法,可不写 top.callback(data); } </script>
<!-- test.com/child.html --> <div style="height:400px"> <p>我是子页面</p> </div> <script type="text/javascript"> window.onload = function () { if (!document.getElementById("crossFrame")) { var iframe = document.createElement(\'iframe\'); iframe.setAttribute(\'style\', \'width:100%\'); iframe.setAttribute(\'src\', \'http://chart.com/poxy.html\'); var height = document.documentElement.scrollHeight; var data = \'{height:\' + height + \'}\'; //通过参数传递高度heights iframe.src = \'http://chart.com/poxy.html#\' + data; document.body.appendChild(iframe); } else { document.getElementById("crossFrame").src = url; } } </script>
以上是关于js iframe跨域访问的主要内容,如果未能解决你的问题,请参考以下文章