老生常谈的跨域处理(4)

<!-- main.html --> var iframeData; var state = 0;//开关变量 var iframe = document.createElement('iframe'); //创建iframe var loadfn = function() { if (state === 1) { iframeData = iframe.contentWindow.name; // 读取数据 alert('获取到了iframe传过来的妹子'+iframeData); }else if (state === 0) { state = 1; iframe.contentWindow.location = 'https://www.a.com/other.html'; //这里是代理页面 other.html /** 这里说明一下: 由于iframe的location改变了,相当于重新载入页面(这是iframe的性质决定的),于是重新执行loadfn方法。         由于当iframe的页面跳到其他地址时,其window.name值保持不变,并且此时开关变量 state已经变为1, 于是就可以获取到window.name值,也就达到了跨域访问的目的了。 **/ }; } iframe.src = 'https://www.b.com/data.html'; //这是是数据页面,data.html if (iframe.attachEvent) { iframe.attachEvent('onload', loadfn); } else { iframe.onload = loadfn; } document.body.appendChild(iframe);

3、获取数据以后销毁这个iframe,释放内存;这也保证了安全(不被其他域frame js访问)。

iframe.contentWindow.document.write(''); iframe.contentWindow.close(); document.body.removeChild(iframe);

优缺点:

浏览器支持情况好,是比较普遍的使用方法

总结

以上总结了js跨域的几种方法,当然还有其他的方法,不过没有。他们各有千秋。其实最主要的区别除了实现方式不一样,主要是浏览器的兼容问题而已。

JSONP:

JSONP的优点是:它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制;它的兼容性更好,在更加古老的浏览器中都可以运行,不需要XMLHttpRequest或ActiveX的支持;并且在请求完毕后可以通过调用callback的方式回传结果。

JSONP的缺点则是:它只支持GET请求而不支持POST等其它类型的HTTP请求;它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。

CORS策略

优点:使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。

缺点:古老的浏览器不支持,不过大部分现代浏览器都支持

document.domain+iframe:只适用于主域相同的跨域问题处理

html5的postMessage:

优点:是html5新引进的特性,可以使用它来向其它的window对象发送消息,无论这个window对象是属于同源或不同源,目前IE8+、FireFox、Chrome、Opera等浏览器都已经支持window.postMessage方法。如果是现代浏览器,首选。

缺点: ie8以前不支持

window.name:

主要是应用当frame的页面跳到其他地址时,其window.name值保持不变的原理。兼容性好。需要照顾落后的浏览器时,首选。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwdspz.html