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