1、这些跨域通信的方法大致可以分为两类:一类是Hack,比如通过title,navigation等对象传递信息,JSONP可以说是一个最优秀的Hack。另一类是HTML5支持,一个是Access-Control-Allow-Origin响应头,一个是window.postMessage。
2、设置 document.domain原理:相同主域名不同子域名下的页面,可以设置document.domain让它们同域限制:同域document提供的是页面间的互操作,需要载入iframe页面
3、下面几个域名下的页面都是可以通过document.domain跨域互操作的:http://a.com/foo,http://b.a.com/bar,http://c.a.com/bar。 但只能以页面嵌套的方式来进行页面互操作,比如常见的iframe方式就可以完成页面嵌套:// URL http://a.com/foovar ifr = document.createElement('iframe');ifr.src = 'http://b.a.com/bar'; ifr.onload = function(){ var ifrdoc = ifr.contentDocument || ifr.contentWindow.document; ifrdoc.getElementsById("foo").innerHTML);};ifr.style.display = 'none';document.body.appendChild(ifr);
4、上述代码所在的URL是http://a.com/foo,它对http://b.a.com/bar的DOM访问要求后者将document.domain往上设置一级:// URL http://b.a.com/bardocument.domain = 'a.com'document.domain只能从子域设置到主域,往下设置以及往其他域名设置都是不允许的, 在Chrome中给出的错误是这样的:Uncaught DOMException: Failed to set the 'domain' property on 'Document': 'baidu.com' is not a suffix of 'b.a.com'
5、有src的标签原理:所有具有src属性的HTML标签都是可以跨域的,包括<img>,<script>限制:需要创建一个DOM对象,只能用于GET方法在document.body中append一个具有src属性的HTML标签,src属性值指向的URL会以GET方法被访问,该访问是可以跨域的。其实样式表的<link>标签也是可以跨域的,只要是有src或href的HTML标签都有跨域的能力。不同的HTML标签发送HTTP请求的时机不同,例如<img>在更改src属性时就会发送请求,而script,iframe,link[rel=stylesheet]只有在添加到DOM树之后才会发送HTTP请求:var img = new Image();img.src = 'http://some/picture'; // 发送HTTP请求var ifr = $('<iframe>', {src: 'http://b.a.com/bar'});$('body').append(ifr); // 发送HTTP请求JSONP
6、原理:<script>是可以跨域的,而且在跨域脚本中可以直接回调当前脚本的函数。限制:需要创建一个DOM对象并且添加到DOM树,只能用于GET方法JSONP利用的是<script>可以跨域的特性,跨域URL返回的脚本不仅包含数据,还包含一个回调:// URL: http://b.a.com/foovar data = { foo: 'bar', bar: 'foo'};callback(data);该例子只用于示例,实际情况应当考虑名称隐藏等问题。