亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JSONP原理及簡單實現

2019-11-20 09:45:12
字體:
來源:轉載
供稿:網友

在web2.0時代,熟練的使用ajax是每個前端攻城師必備的技能。然而由于受到瀏覽器的限制,ajax不允許跨域通信。

JSONP就是目前主流的實現跨域通信的解決方案。

雖然在在jquery中,我們可以通過$.ajax的dataType設置為jsonp來調用jsonp,但是jsonp和ajax的實現原理一個關系都木有。jsonp主要是通過script可以鏈接遠程url來實現跨域請求的。如:

<script src="http://jsonp.js?callback=xxx"></script>

callback定義了一個函數名,而遠程服務端通過調用指定的函數并傳入參數來實現傳遞參數。

搜索了網上好多文章,他們實現方法都過于簡單,要實際應用還要多加修改,我在這里封裝了一個對象,可以直接運用于實際操作。

var JSONP = {// 獲取當前時間戳now: function() {return (new Date()).getTime();},// 獲取16位隨機數rand: function() {return Math.random().toString().substr(2);},// 刪除節點元素removeElem: function(elem) {var parent = elem.parentNode;if(parent && parent.nodeType !== 11) {parent.removeChild(elem);}},// url組裝parseData: function(data) {var ret = "";if(typeof data === "string") {ret = data;}else if(typeof data === "object") {for(var key in data) {ret += "&" + key + "=" + encodeURIComponent(data[key]);}}// 加個時間戳,防止緩存ret += "&_time=" + this.now();ret = ret.substr(1);return ret;},getJSON: function(url, data, func) {// 函數名稱var name;// 拼裝urlurl = url + (url.indexOf("?") === -1 ? "?" : "&") + this.parseData(data);// 檢測callback的函數名是否已經定義var match = /callback=(/w+)/.exec(url);if(match && match[1]) {name = match[1];} else {// 如果未定義函數名的話隨機成一個函數名// 隨機生成的函數名通過時間戳拼16位隨機數的方式,重名的概率基本為0// 如:jsonp_1355750852040_8260732076596469name = "jsonp_" + this.now() + '_' + this.rand();// 把callback中的?替換成函數名url = url.replace("callback=?", "callback="+name);// 處理?被encode的情況url = url.replace("callback=%3F", "callback="+name);}// 創建一個script元素var script = document.createElement("script");script.type = "text/javascript";// 設置要遠程的urlscript.src = url;// 設置id,為了后面可以刪除這個元素script.id = "id_" + name;// 把傳進來的函數重新組裝,并把它設置為全局函數,遠程就是調用這個函數window[name] = function(json) {// 執行這個函數后,要銷毀這個函數window[name] = undefined;// 獲取這個script的元素var elem = document.getElementById("id_" + name);// 刪除head里面插入的script,這三步都是為了不影響污染整個DOM啊JSONP.removeElem(elem);// 執行傳入的的函數func(json);};// 在head里面插入script元素var head = document.getElementsByTagName("head");if(head && head[0]) {head[0].appendChild(script);}}};

實現過程基本寫在注釋里啦,自己看。調用的方法跟jQuery基本一樣。如:

var data = {from: "北京",count: 27,output: "json",callback: "?"}JSONP.getJSON("http://api.qunar.com/cdnWebservices.jcp", data, function(json) {console.log(json)});

當然要這么寫也行:

JSONP.getJSON("http://api.qunar.com/cdnWebservices.jcp?from=北京&count=27&output=json&callback=?", null, function(json) {console.log(json)});

至于服務端的實現,那就比較簡單了,以php為例:

$callback = !empty($_GET['callback']) ? $_GET['callback'] : 'callback';echo $callback.'( .json_encode( $data ).')';

ajax與jsonp的異同再做一些補充說明:

1、ajax和jsonp這兩種技術在調用方式上“看起來”很像,目的也一樣,都是請求一個url,然后把服務器返回的數據進行處理,因此jquery和ext等框架都把jsonp作為ajax的一種形式進行了封裝;

2、但ajax和jsonp其實本質上是不同的東西。ajax的核心是通過XmlHttpRequest獲取非本頁內容,而jsonp的核心則是動態添加<script>標簽來調用服務器提供的js腳本。

3、所以說,其實ajax與jsonp的區別不在于是否跨域,ajax通過服務端代理一樣可以實現跨域,jsonp本身也不排斥同域的數據的獲取。

4、還有就是,jsonp是一種方式或者說非強制性協議,如同ajax一樣,它也不一定非要用json格式來傳遞數據,如果你愿意,字符串都行,只不過這樣不利于用jsonp提供公開服務。

總而言之,jsonp不是ajax的一個特例,哪怕jquery等巨頭把jsonp封裝進了ajax,也不能改變這一點!

好了,寫完了,有什么問題歡迎討論。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
性色av一区二区三区红粉影视| 国外视频精品毛片| 日本国产高清不卡| 亚洲黄色www| 日韩激情视频在线播放| 久久国产精品影片| 久久久久久国产三级电影| 97国产在线视频| 亚洲国产成人久久综合| 国产精品自产拍在线观看| 亚洲欧美日韩国产精品| 永久免费精品影视网站| 疯狂欧美牲乱大交777| 免费91麻豆精品国产自产在线观看| 久久99久久99精品中文字幕| 欧美激情精品在线| 日韩电影大片中文字幕| 日韩欧美亚洲国产一区| 日韩一级黄色av| 九九久久综合网站| 欧美影院在线播放| 日韩一区二区三区xxxx| 国产成人精品亚洲精品| 欧美日韩中文字幕在线视频| 亚洲精品美女久久久久| 久久99热精品| 日韩不卡在线观看| 精品一区二区三区四区| 亚洲成人网在线| 国产精品一二三视频| 欧美丝袜第一区| 91精品在线一区| 国产精品视频久久久| 国内精品视频一区| 国产成人免费av| 色综合五月天导航| 久久久久久久91| 亚洲福利视频在线| 日本道色综合久久影院| 久久久av一区| 在线精品91av| 91午夜在线播放| 国产精品露脸自拍| 国产一区二区三区在线免费观看| 国产精自产拍久久久久久蜜| 久久精品国产一区| 国产精品一区二区三区免费视频| 亚洲视频网站在线观看| 国产一区二区久久精品| 亚洲偷熟乱区亚洲香蕉av| 亚洲香蕉成人av网站在线观看| 亚洲精品综合久久中文字幕| 欧美在线影院在线视频| 成人免费淫片aa视频免费| 毛片精品免费在线观看| 国产欧美日韩高清| 在线看福利67194| 欧美高清视频免费观看| 欧美日韩亚洲激情| 欧美日韩免费在线| 亚洲影视九九影院在线观看| 欧美精品videofree1080p| 国色天香2019中文字幕在线观看| 精品美女久久久久久免费| 精品久久在线播放| 欧美视频在线观看 亚洲欧| 少妇av一区二区三区| 日本久久久久久久久久久| 国产午夜精品免费一区二区三区| 精品国产网站地址| 亚洲成人精品久久| 欧美精品久久久久久久免费观看| 亚洲qvod图片区电影| 久久视频国产精品免费视频在线| 亚洲欧洲视频在线| 日韩免费在线观看视频| 日韩美女写真福利在线观看| 日韩麻豆第一页| 国产成人综合亚洲| 国产精品免费视频久久久| 久久99久国产精品黄毛片入口| 色婷婷综合久久久久| 亚洲欧美一区二区三区四区| 亚洲欧美日韩精品久久奇米色影视| 久久精品中文字幕| 久久成人亚洲精品| 欧美精品激情blacked18| 自拍偷拍亚洲精品| 欧美日韩精品在线观看| 欧美一级大片在线观看| 日本高清不卡在线| 国产精品第1页| 成人国产在线激情| 精品国产一区二区三区久久狼黑人| 这里只有精品视频| 国内外成人免费激情在线视频网站| 国产日韩av高清| 欧美激情videoshd| 亚洲人成网7777777国产| 欧美丝袜一区二区| 亚洲aaa激情| 国产一区二区三区三区在线观看| 国产精品白嫩初高中害羞小美女| 国产精品久久综合av爱欲tv| 91高清视频免费| 国产视频丨精品|在线观看| 好吊成人免视频| 久久久久亚洲精品成人网小说| 国产精品视频自在线| 久久精品国产亚洲7777| 国产亚洲美女久久| 欧美天天综合色影久久精品| 日本精品va在线观看| 欧美成人在线网站| 91精品视频在线播放| 欧美成人精品h版在线观看| 久久综合久久八八| 91综合免费在线| 亚洲欧美日韩一区在线| 精品无人国产偷自产在线| 国产亚洲欧洲在线| 在线播放国产一区中文字幕剧情欧美| 国产精品成人v| 亚洲3p在线观看| 日韩欧美国产高清91| 92国产精品久久久久首页| 欧美性猛交xxxxx免费看| 色伦专区97中文字幕| 国产情人节一区| 国产激情视频一区| 国产成人精品a视频一区www| www.日韩不卡电影av| 欧美乱大交xxxxx| 欧美亚洲视频一区二区| 欧美激情视频给我| 97欧美精品一区二区三区| 国产亚洲精品一区二区| 精品毛片三在线观看| 91黑丝在线观看| 亚洲国产精品成人一区二区| 另类色图亚洲色图| 97在线看免费观看视频在线观看| 日韩中文字幕在线看| 亚洲女同精品视频| 欧美日韩一二三四五区| 亚洲国产精品va在线观看黑人| 九九精品视频在线观看| 日韩视频免费在线观看| 色综合视频一区中文字幕| 国产精品自拍偷拍| 欧美色播在线播放| 久久人人爽国产| 欧美成人激情视频| 久久躁日日躁aaaaxxxx| 国产在线视频欧美| 国产精品久久久久久久久久久不卡| 国产91网红主播在线观看| 国产在线不卡精品| 亚洲精品456在线播放狼人| 欧美亚州一区二区三区| 亚洲乱码国产乱码精品精天堂| 亚洲精品久久久久中文字幕欢迎你| 亚洲国产中文字幕在线观看| 欧美一级视频免费在线观看|