Javascript Ajax總結——其餘跨域技術之圖像Ping和JSONP

在CORS出現以前,爲實現跨域Ajax通訊,開發人員利用DOM中可以執行跨域請求的功能,在不依賴XHR對象的狀況下也能發送某種請求。
一、圖像Ping
這裏使用<img>標籤。一個網頁能夠從任何網頁中加載圖像,不用擔憂跨域或不跨域。
動態建立圖像常常用於圖像Ping。圖像Ping是與服務器進行簡單、單向的跨域通訊的一種方式。
請求的數據:以查詢字符串形式發送
響應的數據:能夠是任意內容,但一般是像素圖或204響應

1 var img = new Image();
2 img.onload = img.onerror = function(){
3     alert("Done!");
4 };
5 img.src = "http://www.example.com/test?name=Anna";

請求從設置src屬性那一刻開始。
圖像Ping最經常使用於跟蹤用戶點擊頁面或動態廣告曝光次數。
兩個主要缺點
a、只能發送GET請求;
b、沒法訪問服務器的響應文本。
所以,圖像Ping只能用於瀏覽器與服務器間的單向通訊。

二、JSONP
JSONP是JSON with padding(填充式JSON或參數式JSON)的簡寫,是應用JSON的一種新方法。
JSONP是被包含在函數調用中的JSON:
callback({ "name": "Nicholas"});
JSONP由2部分組成:回調函數和數據。
回調函數是當響應到來時應該在頁面中調用的函數。回調函數的名字通常是在請求中指定的。數據是傳入回調函數中的JSON數據。
JSONP請求:
http://freegeoip.net/json/?callback=handleResponse
經過查詢字符串來指定JSONP服務的回調參數是很常見的,像上面的URL所示,這裏指定的回調函數的名字叫handleResponse()。

1 function handleResponse(response){
2     alert("You're at IP address " + response.ip + ", which is in " + response.city + ", " + response.region_name);
3 }
4 var script = document.createElement("script");
5 script.src = "http://freegeoip.net/json/?callback=handleResponse";
6 document.body.insertBefore(script, document.body.firstChild);

<script>元素能夠不受限制地從其餘域加載資源。由於JSONP是有效的Javascript代碼,因此在請求完成後,即在JSONP響應加載到頁面中之後,就會當即執行。
JSONP很是簡單易用,可以直接訪問響應文本,支持在瀏覽器和服務器之間雙向通訊。
JSONP不足: JSONP是從其餘域中加載代碼執行。若是其餘域不安全,極可能會在響應中夾帶一些惡意代碼,而此時除了徹底放棄JSONP調用以外,沒有辦法追究; 要肯定JSONP請求是否失敗不容易。雖然HTML5給<script>元素新增了一個onerror事件處理程序,但瀏覽器支持狀況很差。爲此,不得不使用計時器檢測指定時間內是否接收到了響應。但這樣也不能盡如人意,由於不是每一個用戶上網的速度和寬帶都同樣。
相關文章
相關標籤/搜索