代码改变世界

关于javaScript跨域交互

2011-04-12 17:47  rocdu  阅读(375)  评论(0编辑  收藏  举报

总是有人会问关于跨域的问题,优优同学之前有篇关于此题的大作,内容详实。发扬拿来主义,转到这里。

一,什么是跨域?

1,完全跨域

根域名不同的跨域,如sohu.com/index.html和sina.com/index.html便是完全跨域

2,跨子域名

根域名相同,但是子域名不同,如mdc.sohu.com/index.html和cms5.sohu.com/index.html

两种特殊情况

即使页面不跨域,js交互也会受到影响。

1,不同端口

根域名一致,但是端口不一致,如sohu.com/index.html和sohu.com:1234/index.html

2,不同协议

根域名一致,但是安全协议不一致,如http://sohu.com/index.html和https://sohu.com/index.html

二,什么时候会发生跨域?如果解决跨域的JS交互问题?

假设页面A和B是跨域的页面,那末下面两种情况会发生跨域问题

1,页面A从B获取json、script等非dom元素的数据

解决办法:利用jquery框架中的$.getJSON和$.geScript。后台技术也可解决此类问题,不在此话题内便不扯了…

2,页面A获取B的dom元素或JS方法和变量(简称DOM交互)

典型的一个应用就是iframe和frame的使用。拿iframe举个例子即:

页面A内有一个iframe,该iframe引用了页面B,即iframe.src=”B”.

这种情况,

如果A和B不跨域

在JS里面A和B是可以互相交互的,可以互相读取对方的dom元素、公有函数、属性等等,例如,

在页面A内,可以通过window.frames["iframeName"].document来访问页面B的document对象;

在页面B内,可以通过parent引用页面A内的各种属性或者方法如parent.p1,parent.hello().

如果A和B跨域

对于完全跨域的情况,页面A和B是无法通过JS进行DOM交互的。

对于跨子域的情况,默认情况下也无法DOM交互。但是可以通过指定document.domain的值为根域名来解决。即A和B页面中,head标签内加入
<script type=”text/javascript”>document.domain=”A和B的根域名”;</script>

对于端口不一样和协议不一样的两种情况,参考mozilla开发中心的文档说明,页面A和B应该也是无法通过JS进行dom的交互的!