摘要:原理:借助script可以跨域的思想,將跨域請求放在script中,當(dāng)頁面解析到改script標(biāo)簽時,就會向該src指向的地址發(fā)出一個請求,達(dá)到跨域請求的目的。兩點:(1)主要是利用了 <script/>標(biāo)簽的跨域性 (2)script標(biāo)簽對javascript文檔的動態(tài)解析來實現(xiàn)服務(wù)器端配合處理: 在前端傳入事件處理函數(shù)如url?callback=fun,后臺獲取這個cal
原理:借助script可以跨域的思想,將跨域請求放在script中,當(dāng)頁面解析到改script標(biāo)簽時,就會向該src指向的地址發(fā)出一個請求,達(dá)到跨域請求的目的。
兩點:
(1)主要是利用了 <script/>標(biāo)簽的跨域性
(2)script標(biāo)簽對javascript文檔的動態(tài)解析來實現(xiàn)
服務(wù)器端配合處理: 在前端傳入事件處理函數(shù)如url?callback=fun,后臺獲取這個callback參數(shù),通過字符串拼接,組合成函數(shù)調(diào)用的形式,將數(shù)據(jù)也拼接進(jìn)去,構(gòu)造js代碼,返回給前端的script標(biāo)簽,在前端script標(biāo)簽會自動執(zhí)行返回的代碼。(因為后臺沒法直接執(zhí)行函數(shù)調(diào)用),所以是在后臺返回一個拼接的調(diào)用形式,返回給前端,script標(biāo)簽會自動執(zhí)行,從而實現(xiàn)跨域。
demo:
<script> function handlerData(data){ alert('獲取到數(shù)據(jù)'); console.log(data); } </script> <script src='http://webgis.ecnu.edu.cn/beta/cross.php?callback=handlerData'></script>
服務(wù)器端:
<?php $callback = $_GET['callback']; $data ='["hello","world"]'; echo $callback."(".$data.")"; //拼接字符串 或者 "try" $callback."($data)". "catch(e){}" ?>
結(jié)果如下
這種方法實現(xiàn)的話,每個請求都要重新生成數(shù)據(jù),可以采用動態(tài)生成腳本的方式,將數(shù)據(jù)放到腳本中,腳本中存放數(shù)據(jù),向客戶端返回一個js
缺點:返回的函數(shù)執(zhí)行出錯時,沒有錯誤提示,只能看控制臺下的報錯信息。
優(yōu)缺點:
使用JSON的優(yōu)點在于:
比XML輕了很多,沒有那么多冗余的東西。
JSON也是具有很好的可讀性的,但是通常返回的都是壓縮過后的。不像XML這樣的瀏覽器可以直接顯示,瀏覽器對于JSON的格式化的顯示就需要借助一些插件了。
在JavaScript中處理JSON很簡單。
其他語言例如PHP對于JSON的支持也不錯。
JSON也有一些劣勢:
JSON在服務(wù)端語言的支持不像XML那么廣泛,不過JSON.org上提供很多語言的庫。
如果你使用eval()來解析的話,會容易出現(xiàn)安全問題。
盡管如此,JSON的優(yōu)點還是很明顯的。他是Ajax數(shù)據(jù)交互的很理想的數(shù)據(jù)格式。
第一,也是最重要的一點,沒有關(guān)于 JSONP 調(diào)用的錯誤處理。如果動態(tài)腳本插入有效,就執(zhí)行調(diào)用;如果無效,就靜默失敗。失敗是沒有任何提示的。例如,不能從服務(wù)器捕捉到 404 錯誤,也不能取消或重新開始請求。不過,等待一段時間還沒有響應(yīng)的話,就不用理它了。(未來的 jQuery 版本可能有終止 JSONP 請求的特性)。
JSONP 的另一個主要缺陷是被不信任的服務(wù)使用時會很危險。因為 JSONP 服務(wù)返回打包在函數(shù)調(diào)用中的 JSON 響應(yīng),而函數(shù)調(diào)用是由瀏覽器執(zhí)行的,這使宿主 Web 應(yīng)用程序更容易受到各類攻擊。如果打算使用 JSONP 服務(wù),了解它能造成的威脅非常重要。