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