1、什么叫作js跨域javascript
javascript为了安全着想,在ajax以及iframe中不容许跨域调用。php
2、哪些状况算做跨域html
1.协议名称不一样html5
从http://www.test.com中调用https://www.test.comjava
2.端口不一样jquery
从http://www.test.com调用http://www.test.com:9999ajax
3.域名不一样 json
从http://www.test.com调用http://login.test.com跨域
从http://www.test.com调用http://www.test2.com浏览器
3、如何解决js跨域
1.使用jsonp
在js中,咱们直接用XMLHttpRequest
请求不一样域上的数据时,是不能够的。可是,在页面上引入不一样域上的js脚本文件倒是能够的,jsonp正是利用这个特性来实现的。 例如:
<script type="text/javascript"> function dosomething(jsondata){ //处理得到的json数据 } </script> <script src="http://example.com/data.php?callback=dosomething"></script>
jsonp就是回调函数+数据。callback({"name":"Tom"})典型的jsonp。js文件载入成功后会执行咱们在url参数中指定的函数,而且会把咱们须要的json数据做为参数传入。
若是你的页面使用jquery,那么经过它封装的方法就能很方便的来进行jsonp操做了。
<script type="text/javascript"> $.getJSON('http://example.com/data.php?callback=?,function(jsondata)'){ //处理得到的json数据 }); </script>
jquery
会自动生成一个全局函数来替换callback=?
中的问号,以后获取到数据后又会自动销毁,实际上就是起一个临时代理函数的做用。$.getJSON
方法会自动判断是否跨域,不跨域的话,就调用普通的ajax
方法;跨域的话,则会以异步加载js文件的形式来调用jsonp
的回调函数。
优势:原生支持,比较老的游览器也都支持。缺点:只支持GET方式,不支持POST方式
2.CORS方式
document.domain的设置是有限制的,咱们只能把document.domain设置成自身或更高一级的父域,且主域必须相同。
1.在页面 http://www.example.com/a.html
中设置document.domain
:
<iframe id = "iframe" src="http://example.com/b.html" onload = "test()"></iframe> <script type="text/javascript"> document.domain = 'example.com';//设置成主域 function test(){ alert(document.getElementById('iframe').contentWindow);//contentWindow 可取得子窗口的 window 对象 } </script>
2.在页面 http://example.com/b.html
中也设置document.domain
:
<script type="text/javascript"> document.domain = 'example.com';//在iframe载入这个页面也设置document.domain,使之与主页面的document.domain相同 </script>
修改document.domain
的方法只适用于不一样子域的框架间的交互。
window
对象有个name
属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的全部的页面都是共享一个window.name
的,每一个页面对window.name
都有读写的权限,window.name
是持久存在一个窗口载入过的全部页面中的
window.postMessage(message,targetOrigin)
方法是html5
新引进的特性,可使用它来向其它的window
对象发送消息,不管这个window对象是属于同源或不一样源,目前IE8+、FireFox、Chrome、Opera
等浏览器都已经支持window.postMessage
方法。