首先,先了解浏覽器有一個很重要安全性限制,即為同源政策:不同域的用戶端腳本在無明确授權的情況下不能讀些對方資源。跨域也就是不同源~
舉個例子:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iN3ADOxADNmVDMhVmN1AjYyYzX0UTNxkTMwIzLcZDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
隻要協定,端口,域名有一個不同,即為跨域!
然而,當進行一些比較深入的前端程式設計的時候,不可避免地需要進行跨域操作,這時候“同源政策”就顯得過于苛刻。
解決方法:
1.使用jsonp解決跨域 :(僅适用于GET請求)
實作原理:
1 var eleScript = document.createElement(“script”);
2 eleScript.type = “text/javascript”;
3 eleScript.src = “http://example2.com/getinfo.php”;
4 document.getElementsByTagName(“HEAD”)[0].appendChild(eleScript);
使用jquery解決
1 $.ajax({
2 url: http://跨域的dns/document!searchJSONResult.action,
3 type: “GET”,
4 dataType: ‘jsonp’, //主要是這裡和原來的json改變了!
5 jsonp: ‘jsoncallback’,
6 })
2.使用HTML5的window.postMessage方法來跨域傳送資料 (隻相容IE8+、FireFox、Chrome、Opera等浏覽器)
1 window.postMessage(message,targetOrigin)
windowObj : 接受消息的 Window 對象。
message : 在最新的浏覽器中可以是對象。
targetOrigin : 目标的源,* 表示任意。
可以使用它來向其它的window對象發送消息,功能非常強大,無視域名無視端口……無論這個window對象是屬于同源或不同源。
例子:
1 var windowObj = window; // 可以是其他的 Window 對象的引用
2 var data = null;
3
4 addEventListener(‘message’, function(e){
5 if(e.origin == ‘http://jasonkid.github.io/fezone’) {
6 data = e.data;
7
8 e.source.postMessage(‘Got it!’, ‘*’);
9 }
10 });
複制代碼
message 事件就是用來接收 postMessage 發送過來的請求的。函數參數的屬性有以下幾個:
origin : 發送消息的 window 的源。
data : 資料。
source : 發送消息的 Window 對象。
這個方法非常強大,無視協定,端口,域名的不同。下面是烤熟的栗子:
JavaScript
varwindowObj=window;// 可以是其他的 Window 對象的引用
vardata=null;
addEventListener(‘message’,function(e){
if(e.origin=='http://jasonkid.github.io/fezone'){
data=e.data;
e.source.postMessage('Got it!','*');
}
});
message 事件就是用來接收 postMessage 發送過來的請求的。函數參數的屬性有以下幾個: