jQuery中g(shù)etJSON跨域原理的深入講解
前幾天我在開(kāi)發(fā)一個(gè)工具的時(shí)候,其中有個(gè)功能就是獲取本頁(yè)面的短網(wǎng)址。
這個(gè)想法是好的,可是在我付諸于行動(dòng)的時(shí)候,發(fā)現(xiàn)這個(gè)需要跨域。
起初我的想法就是,跨域的最簡(jiǎn)單的方法就是增加一個(gè)script標(biāo)簽,因?yàn)閟cript標(biāo)簽是允許跨域的。
但是問(wèn)題又來(lái)了,對(duì)方的API返回的是個(gè)json對(duì)象,用script標(biāo)簽只能執(zhí)行,卻不能獲取到里面的東西,也就是說(shuō)返回的東西是不可控的。
隨后我就想到了jQuery中的getJSON的方法,學(xué)習(xí)了一下,沒(méi)想到里面的文章這么大。
jQuery非常聰明,他也意識(shí)到只靠script請(qǐng)求是無(wú)法接受到返回的東西的,所以他就設(shè)計(jì)了一個(gè)全局的callback函數(shù),發(fā)送請(qǐng)求的時(shí)候把這個(gè)callback函數(shù)也傳進(jìn)去。
服務(wù)器判斷是否有這個(gè)callback函數(shù),如果沒(méi)有就返回一個(gè)對(duì)象,如果有就返回一個(gè)函數(shù)名(對(duì)象)。
我們可以通過(guò)下面這個(gè)地址來(lái)看一下
http://to.ly/api.php?json=1&longurl=http%3A%2F%2Fwww.skiyo.cn
大家可以打開(kāi)一下,結(jié)果返回的是一個(gè)json對(duì)象。
如果我加上callback參數(shù)
http://to.ly/api.php?json=1&longurl=http%3A%2F%2Fwww.skiyo.cn&callback=somefunc
大家可以看到返回的是
somefunc({“shorturl”: “http:\/\/to.ly\/3XHP”, “ok”: true})
傳入的也正好是函數(shù)名。
這個(gè)想法很不錯(cuò),缺點(diǎn)就是對(duì)方服務(wù)器必須是可控的。
大方向是這個(gè)的,但是還有一些細(xì)節(jié)的小技巧,比如說(shuō)如何在匿名函數(shù)中設(shè)置一個(gè)全局函數(shù),如何將這個(gè)全局函數(shù)變?yōu)槟涿瘮?shù)!
本來(lái)想直接把jQuery中的getJSON拿來(lái)直接用的,可是看了才知道,jQuery的ajax方法都混合到一起了,想剝落下來(lái)也不是一件容易的事。
慶幸的是我還懂一點(diǎn)JavaScript,經(jīng)過(guò)我的加工與修改,下面的例子已經(jīng)可以正常使用。詳細(xì)的可以查看注釋。
以下是代碼片段:
(function() { var cross = { //設(shè)置一個(gè)隨機(jī)的callback函數(shù)..防止跟其他的全局函數(shù)重名 callback : 'cross' + parseInt(Math.random()*1000), init : function() { this.getJSON('http://to.ly/api.php?json=1&longurl='+encodeURIComponent('http://www.skiyo.cn/'), function(data){ alert(data.shorturl); }); }, getJSON : function(url, callback) { var c = this.callback; url = url + "&callback=" + c; // Handle JSONP-style loading //將函數(shù)名設(shè)置為window的一個(gè)方法,這樣此方法就是全局的了. window[ c ] = window[ c ] || function( data ) { //調(diào)用匿名函數(shù) callback(data); // Garbage collect window[ c ] = undefined; try { delete window[ c ]; } catch(e) {} if ( head ) { head.removeChild( script ); } }; var head = document.getElementsByTagName("head")[0] || document.documentElement; var script = document.createElement("script"); script.src = url; // Handle Script loading var done = false; // Attach handlers for all browsers script.onload = script.onreadystatechange = function() { if ( !done && (!this.readyState this.readyState === "loaded" || this.readyState === "complete") ) { done = true; // Handle memory leak in IE script.onload = script.onreadystatechange = null; if ( head && script.parentNode ) { head.removeChild( script ); } } }; head.insertBefore( script, head.firstChild ); }, }; //go cross.init(); })();
總結(jié)
到此這篇關(guān)于jQuery中g(shù)etJSON跨域原理的文章就介紹到這了,更多相關(guān)jQuery getJSON跨域原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 在vue中使用jsonp進(jìn)行跨域請(qǐng)求接口操作
- 原生js實(shí)現(xiàn)ajax請(qǐng)求和JSONP跨域請(qǐng)求操作示例
- JS實(shí)現(xiàn)iframe中子父頁(yè)面跨域通訊的方法分析
- Vue項(xiàng)目中使用jsonp抓取跨域數(shù)據(jù)的方法
- javascript使用鏈接跨域下載圖片
- Ajax跨域問(wèn)題及解決方案(jsonp,cors)
- 說(shuō)說(shuō)如何利用 Node.js 代理解決跨域問(wèn)題
- 利用jsonp解決js讀取本地json跨域的問(wèn)題
- JS常用跨域方法實(shí)現(xiàn)原理解析
相關(guān)文章
Jquery ajax執(zhí)行順序 返回自定義錯(cuò)誤信息(實(shí)例講解)
由于Jquery中的Ajax的async默認(rèn)是true(異步請(qǐng)求),如果想一個(gè)Ajax執(zhí)行完后再執(zhí)行另一個(gè)Ajax, 需要把a(bǔ)sync=false就可以了2013-11-1130個(gè)經(jīng)典的jQuery代碼開(kāi)發(fā)技巧
這篇文章主要介紹了30個(gè)經(jīng)典的jQuery代碼開(kāi)發(fā)技巧,包含了常見(jiàn)屬性、方法、元素等的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12從零開(kāi)始學(xué)習(xí)jQuery (十) jQueryUI常用功能實(shí)戰(zhàn)
本文是實(shí)戰(zhàn)篇. 使用jQueryUI完成制作網(wǎng)站的大部分常用功能.2011-02-02使用jQuery處理AJAX請(qǐng)求的基礎(chǔ)學(xué)習(xí)教程
這篇文章主要介紹了使用jQuery處理AJAX請(qǐng)求的基礎(chǔ)學(xué)習(xí)教程,除此之外還引申了鏈?zhǔn)教幚硎录卣{(diào)的寫(xiě)法,由淺入深非常值得借鑒,需要的朋友可以參考下2016-05-05將鼠標(biāo)焦點(diǎn)定位到文本框最后(代碼分享)
本文主要分享了將鼠標(biāo)焦點(diǎn)定位到文本框最后的實(shí)例代碼。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01jquery、js調(diào)用iframe父窗口與子窗口元素的方法整理
本節(jié)主要介紹了jquery、js調(diào)用iframe父窗口與子窗口元素的方法,需要的朋友可以參考下2014-07-07jQuery獲取父元素節(jié)點(diǎn)、子元素節(jié)點(diǎn)及兄弟元素節(jié)點(diǎn)的方法
這篇文章主要介紹了jQuery獲取父元素節(jié)點(diǎn)、子元素節(jié)點(diǎn)及兄弟元素節(jié)點(diǎn)的方法,結(jié)合實(shí)例形式總結(jié)分析了jQuery節(jié)點(diǎn)操作的相關(guān)技巧,需要的朋友可以參考下2016-04-04jQuery基于cookie實(shí)現(xiàn)的購(gòu)物車實(shí)例分析
這篇文章主要介紹了jQuery基于cookie實(shí)現(xiàn)購(gòu)物車的方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了jQuery基于cookie實(shí)現(xiàn)針對(duì)商品信息的購(gòu)物車存儲(chǔ)功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12jQuery遍歷對(duì)象、數(shù)組、集合實(shí)例
這篇文章主要介紹了jQuery遍歷對(duì)象、數(shù)組、集合實(shí)例,本文直接給出實(shí)例代碼,在代碼中有詳細(xì)注釋來(lái)解釋代碼的作用,需要的朋友可以參考下2014-11-11