跨域梳理
跨域技術很多,這裏做個小梳理:
CORS(跨域資源分享):
在IE8+中是通過一個XDomainRequest對象實現的,使用方法和XMLHttpRequest相似:
var xdr=new XDomainRequest(); xdr.onload=fn; xdr.onerror-fn; xdr.open(method,url); xdr.send();
IE的XDR對象:
1.不傳送cookie;
2.只能設置請求頭的Content-Type
3.不能訪問響應頭部
XDR對象只支持異步請求,且返回後只能訪問responseText。
而其他瀏覽器則是通過XMLHttpRequest對象實現對CORS的支持。在操作上的唯一區別是在open()的url參數中傳入絕對路徑,可以訪問status/statusText。
1.不能用setRequestHeader()自定義頭部。
2.不發送he‘jie‘shou和接收cookie
3.調用getAllResponseHeaders()只返回空字符串。
下面一段代碼是《高級》中給出的跨瀏覽器CORS
1 function createCORSRequest(method,url){ 2 var xhr = new XMLHttpRequest(); 3 if("withCredenticals" in xhr){ 4 xhr.open(method,url,true); 5 }else if(typeof XDomainRequest != "undefined"){6 xhr = new XDomainRequest(); 7 xhr.open(method,url); 8 }else{ 9 xhr=null; 10 } 11 return xhr; 12 } 13 var request=createCORSRequest(‘get‘,url); 14 if(request){ 15 request.onload=function(){}; 16 request.send(null); 17 }
最後14-17行的代碼其實是不完整的,因為IE的XDR對象在返回的時候會觸發onload事件,也就是說我們只能在onload中操作返回的responseText。但是對於其他瀏覽器則還是看readystatechange和status操作返回數據。
其他跨域技術:
圖像ping:
只能發送GET請求,無法訪問服務器的響應文本,多用在跟蹤用戶點擊頁面/動態廣告曝光次數。
1 var img=new Image(); 2 img.onload=fn; 3 img.onerror=fn; 4 img.src=‘url?queryString‘
JSONP(參數式JSON):主要是兩部分,一個是callback函數,一個事作為函數參數的json數據。
JSONP的實現一般是在頁面動態創建並插入一個script標簽,且script.src=url?callback=handleresponse,這裏將一個函數名傳給服務器,服務器接到請求後返回一段代碼:
handleresponse({"name":"value"});
1.查詢字符串中callbak=handleresponse,意思是我們頁面已經有一個handleresponse函數,用來處理將要返回的數據。我們把這個函數名作為查詢字符串發給服務器。
2.服務器將要返回的json數據作為參數 傳入接收到的handleresponse函數中,並把這段代碼發回來。
3.服務器發回來的js代碼被頁面加載後,頁面立即執行:
handleresponse({"name":"value"});
Comet部分先緩一緩
跨域梳理