我們發(fā)送一個(gè) jsonp 的請(qǐng)求:
$.ajax({ crossDomain:true,//強(qiáng)制跨域 url: ' http://url...’, //不同的域 type: 'GET', // jsonp模式只有GET是合法的 data: { 'action': 'aaron' }, // 預(yù)傳參的數(shù)組 dataType: 'jsonp', // 數(shù)據(jù)類型 jsonp: 'backfunc', // 指定回調(diào)函數(shù)名,與服務(wù)器端接收的一致,并回傳回來(lái) })
通過(guò) ajax 請(qǐng)求不同域的實(shí)現(xiàn),jsonp 底層不是靠 XmlHttpRequest 而是 script,所以不要被這個(gè)方法給迷惑了。
這里有幾個(gè)要注意的:
http://192.168.1.113:8080/github/jQuery/jsonp.php?callback=flightHandler&action=aaron&_=1418782732584 ">
然后通過(guò)創(chuàng)建腳本動(dòng)態(tài)加載:
<script type="text/javascript" src=" http://192.168.1.113:8080/github/jQuery/jsonp.php?callback=flightHandler&action=aaron&_=1418782732584 "></script>
然后 php 方就會(huì)收到 get 請(qǐng)求的參數(shù),通過(guò)解析出 callback 執(zhí)行 callback 這個(gè)回調(diào)并傳遞參數(shù)。
要處理的幾個(gè)問(wèn)題:
1. 采用的是腳本請(qǐng)求的方法,所以雖然 dataType 是 'jsonp' 但是內(nèi)部還是按照 script 處理 2. get 請(qǐng)求的后綴拼接,編碼的處理 3. 避免緩存的處理
所以流程就會(huì)分二步:
分發(fā)器執(zhí)行代碼:
當(dāng)我們所有的參數(shù)都轉(zhuǎn)化好了,此時(shí)會(huì)經(jīng)過(guò)請(qǐng)求發(fā)送器用來(lái)處理發(fā)送的具體,為什么會(huì)叫做分發(fā)器,因?yàn)榘l(fā)送的請(qǐng)求目標(biāo),ajax 因?yàn)閰㈦s了 jsonp 的處理,所以實(shí)際上的請(qǐng)求不是通過(guò) xhr.send(XmlHttpRequest) 發(fā)送的,而是通過(guò) get 方式的腳本加載的,所以 transports 對(duì)象在初始化構(gòu)件的時(shí)候,會(huì)生成 2 個(gè)處理器
*: Array[1] 針對(duì)xhr方式 script: Array[1] 針對(duì)script,jsonp方式
所以 transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR),那么得到的 transport 就會(huì)根據(jù)當(dāng)前的處理的類型,來(lái)選擇采用哪種發(fā)送器(*、script)所以最終的實(shí)現(xiàn)就是通過(guò)動(dòng)態(tài)加載腳本!
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過(guò)多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報(bào)