一、可能平时最经常使用到的就是get方式的jsonp跨域,能够用jquery提供的$.ajax 、$.getJSON。javascript
$.ajax({ url:'接口地址', type:'GET', data:'想给接口传的数据', dataType:'jsonp', success:function(ret){ console.log(ret); } });
这样很简单的就能够实现jsonp的跨域,获取接口返回值。php
想更多的了解$.ajax能够参考下面的连接,里面有很详细的介绍:连接描述html
二、post方式的form表单跨域。java
a.com html: <script> function postCallback(data){} </script> <form acrion='接口连接' method='post' target='ifr'></form> <iframe name='ifr'></iframe>
a.com callback.php: <?php header('Content-type: text/javascript'); echo '<script>'; //回调原页面上函数处理返回结果 echo 'window.top.postcallback(' .$_GET['data']. ');'; echo '</script>'; b.com api.php: <?php //.... $data = '{"ret":0,"msg":"ok"}'; // ** 让结果跳转到a.com域 ** header("Location: http://a.com/callback.php?data=".urlencode($data));
三、CORS跨域node
原理:CORS定义一种跨域访问的机制,可让AJAX实现跨域访问。CORS 容许一个域上的网络应用向另外一个域提交跨域 AJAX 请求。实现此功能很是简单,只需由服务器发送一个响应标头便可。jquery
注:移动终端上,除了opera Mini都支持。ajax
利用 CORS,http://www.b.com 只需添加一个标头,就能够容许来自 http://www.a.com 的请求,下图是我在PHP中的 hander() 设置,“*”号表示容许任何域向咱们的服务端提交请求:json
header("Access-Control-Allow-Origin:*");
也能够设置指定域名:api
header("Access-Control-Allow-Origin:http://www.b.com");
js部分:跨域
$.ajax({ url: a_cross_domain_url, crossDomain: true, method: "POST" });
CORS比较适合应用在传送信息量较大以及移动端来使用。
四、script标签来跨域
<script src='访问的接口地址'></script>
js.onload = js.onreadystatechange = function() { if (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') { // callback在此处执行 js.onload = js.onreadystatechange = null; } };
五、h5的postMessage
otherWindow.postMessage(message, targetOrigin); otherWindow: 对接收信息页面的window的引用。能够是页面中iframe的contentWindow属性;window.open的返回值;经过name或下标从window.frames取到的值。 message: 所要发送的数据,string类型。 targetOrigin: 用于限制otherWindow,“*”表示不做限制 a.com/index.html中的代码: <iframe id="ifr" src="b.com/index.html"></iframe> <script type="text/javascript"> window.onload = function() { var ifr = document.getElementById('ifr'); var targetOrigin = 'http://b.com'; // 若写成'http://b.com/c/proxy.html'效果同样 // 若写成'http://c.com'就不会执行postMessage了 ifr.contentWindow.postMessage('I was there!', targetOrigin); }; </script> b.com/index.html中的代码: <script type="text/javascript"> window.addEventListener('message', function(event){ // 经过origin属性判断消息来源地址 if (event.origin == 'http://a.com') { alert(event.data); // 弹出"I was there!" alert(event.source); // 对a.com、index.html中window对象的引用 // 但因为同源策略,这里event.source不能够访问window对象 } }, false); </script>
六、子域跨域(document.domain+iframe)
www.a.com上的a.html document.domain = 'a.com'; var ifr = document.createElement('iframe'); ifr.src = 'http://script.a.com/b.html'; ifr.style.display = 'none'; document.body.appendChild(ifr); ifr.onload = function(){ var doc = ifr.contentDocument || ifr.contentWindow.document; // 在这里操纵b.html alert(doc.getElementsByTagName("h1")[0].childNodes[0].nodeValue); }; script.a.com上的b.html document.domain = 'a.com';
具体的作法是能够在http://www.a.com/a.html
和http://script.a.com/b.html
两个文件中分别加上document.domain = 'a.com'
;而后经过a.html
文件中建立一个iframe
,去控制iframe
的contentDocument
,这样两个js
文件之间就能够“交互”了。固然这种办法只能解决主域相同而二级域名不一样的状况。