這一篇文章呢,主要是以前一直聽別人講json跨域跨域,可是仍是一頭霧水,只知其一,因而一怒之下,翻閱各類資料,若是有不正確的地方,勞煩指正一下^_^javascript
首先,先了解瀏覽器有一個很重要安全性限制,即爲同源策略:不一樣域的客戶端腳本在無明確受權的狀況下不能讀些對方資源。跨域也就是不一樣源~php
舉個例子:前端
只要協議,端口,域名有一個不一樣,即爲跨域!java
然而,當進行一些比較深刻的前端編程的時候,不可避免地須要進行跨域操做,這時候「同源策略」就顯得過於苛刻。jquery
解決方法:git
1.使用jsonp解決跨域 :(僅適用於GET請求)github
使用JavaScript代碼解決ajax
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等瀏覽器)json
1 window.postMessage(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 發送過來的請求的。函數參數的屬性有如下幾個:
這個方法很是強大,無視協議,端口,域名的不一樣。下面是烤熟的栗子:
1
2
3
4
5
6
7
8
9
10
|
var
windowObj
=
window
;
// 能夠是其餘的 Window 對象的引用
var
data
=
null
;
addEventListener
(
'message'
,
function
(
e
)
{
if
(
e
.
origin
==
'http://jasonkid.github.io/fezone'
)
{
data
=
e
.
data
;
e
.
source
.
postMessage
(
'Got it!'
,
'*'
)
;
}
}
)
;
|
message 事件就是用來接收 postMessage 發送過來的請求的。函數參數的屬性有如下幾個: