浏览器对于javascript的同源策略的限制,例如a.com下面的js不能调用b.com中的js,对象或数据(由于a.com和b.com是不一样域),因此跨域就出现了。同域的概念又是什么呢?所谓的同源是指,域名、协议、端口均为相同。javascript
JSONP:
JSONP 是一种非官方的跨域数据交互协议。JSONP 本质上是利用 <script><img><iframe>
等标签不受同源策略限制,能够从不一样域加载并执行资源的特性,来实现数据跨域传输。
JSONP由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数,而数据就是传入回调函数中的JSON数据。<br/>这种方式很是好用,可是有一个缺陷,只能实现get请求。前端
设置代理:
能够在服务器搭建nginx代理转发,或者由后台去调用以后把结果返回给前端,后台作一下中转。还能够搭建node服务器,用node进行代理转发。java
请求的后台设置容许跨域:header('Access-Control-Allow-Origin:*')
;//容许全部来源访问header('Access-Control-Allow-Method:POST,GET')
;//容许访问的方式node
iframe:
因此跨域通讯其实很简单,在iframe和主页里都不断地检测hashtag有没有变化,一旦有变化,就作出相应的改变。nginx
setInterval(function() { var hashVal = window.location.hash.substr(1); document.body.style.backgroundColor = hashVal; }, 1000);
这么作的问题就是,须要不断地去检测hashtag是否改变,效率有点低,若是能经过原生的监听来实现,就会更加高效和优雅。这里就涉及到另外一个iframe特性:能够设置其余iframe的大小,即便是不一样域的。而页面的resize事件是能够监听的,因此就有了下面这个模型。<br/>
主页面先把消息附加到hashtag,而后改变一个隐藏的(或者页面外的)iframe的size。这个iframe会监听resize事件,同时捕获到hashtag。捕获到hashtag后(也就是所需的数据),再对hashtag作进一步的处理。处理完后把数据传到主页内的一个iframe,或者直接操做该iframe。这样就比较优雅地完成了跨域操做。ajax
最近在作一个涉及到地图的项目,使用的是百度地图API,就出现了跨域的问题。
http://api.map.baidu.com/geoc... 这个api的做用是获取周边地理信息,在调用的时候产生了跨域问题json
后面采用了JSONP的方式解决api
$.ajax({ url: 'http://api.map.baidu.com/geocoder/v2/?address=成都&output=json&ak=sn4yosvUfbGYsdffew3wq23114', type: 'GET', async:false,//设置同步。ajax默认异步 dataType: 'jsonp', jsonp:'callback',//传递给请求处理程序或页面的,用以得到jsonp回调函数名的参数名(默认为:callback) jsonpCallback:"callback",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名 timeout: 5000, contentType: 'application/json; charset=utf-8', success: function (result){ console.log(result); } })
不少时候咱们都会碰到跨域问题,但也有不少方法来解决跨域问题,在解决跨域时,咱们也要注意一下安全性问题跨域