一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - jQuery中getJSON跨域原理的深入講解

jQuery中getJSON跨域原理的深入講解

2021-09-07 16:52IT技術博客大學習 JavaScript

這篇文章主要給大家介紹了關于jQuery中getJSON跨域原理的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前幾天我在開發一個工具的時候,其中有個功能就是獲取本頁面的短網址。

這個想法是好的,可是在我付諸于行動的時候,發現這個需要跨域。

起初我的想法就是,跨域的最簡單的方法就是增加一個script標簽,因為script標簽是允許跨域的。

但是問題又來了,對方的API返回的是個json對象,用script標簽只能執行,卻不能獲取到里面的東西,也就是說返回的東西是不可控的。

隨后我就想到了jQuery中的getJSON的方法,學習了一下,沒想到里面的文章這么大。

jQuery非常聰明,他也意識到只靠script請求是無法接受到返回的東西的,所以他就設計了一個全局的callback函數,發送請求的時候把這個callback函數也傳進去。

服務器判斷是否有這個callback函數,如果沒有就返回一個對象,如果有就返回一個函數名(對象)。

我們可以通過下面這個地址來看一下

http://to.ly/api.php?json=1&longurl=http%3A%2F%2Fwww.skiyo.cn

大家可以打開一下,結果返回的是一個json對象。

如果我加上callback參數

http://to.ly/api.php?json=1&longurl=http%3A%2F%2Fwww.skiyo.cn&callback=somefunc

大家可以看到返回的是

?
1
somefunc({“shorturl”: “http:\/\/to.ly\/3XHP”, “ok”: true})

傳入的也正好是函數名。

這個想法很不錯,缺點就是對方服務器必須是可控的。

大方向是這個的,但是還有一些細節的小技巧,比如說如何在匿名函數中設置一個全局函數,如何將這個全局函數變為匿名函數!

本來想直接把jQuery中的getJSON拿來直接用的,可是看了才知道,jQuery的ajax方法都混合到一起了,想剝落下來也不是一件容易的事。

慶幸的是我還懂一點JavaScript,經過我的加工與修改,下面的例子已經可以正常使用。詳細的可以查看注釋。

以下是代碼片段:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
(function() {
 var cross = {
 //設置一個隨機的callback函數..防止跟其他的全局函數重名
 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
 //將函數名設置為window的一個方法,這樣此方法就是全局的了.
 window[ c ] = window[ c ] || function( data ) {
 //調用匿名函數
 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();
})();

總結

到此這篇關于jQuery中getJSON跨域原理的文章就介紹到這了,更多相關jQuery getJSON跨域原理內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blogread.cn/it/article/1710

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 韩国三级视频网站 | free性videoxxⅹ印度 | poronovideos极度变态 | 男人天堂a | 亚州男人的天堂 | 97网站| 大妹子最新视频在线观看 | 国产福利视频一区二区微拍 | aaa一级最新毛片 | 国产成人精品一区二三区在线观看 | 久久一本综合 | 亚洲 欧美 中文字幕 在线 | 欧美日韩精彩视频 | 男女车车好快的车车免费网站 | 青草热久精品视频在线观看 | 91精品婷婷国产综合久久8 | 亚裔aⅴ艳星katsuni | 色婷婷六月丁香在线观看 | 日本精工厂网址 | 毛片网站观看 | 99久久精品无码一区二区毛片 | 欧美精品综合一区二区三区 | 性色AV乱码一区二区三区视频 | 丁香五香天堂 | 特黄级 | 日韩亚洲人成网站在线播放 | 手机av影院| 免费观看国产视频 | 精品性影院一区二区三区内射 | 青草久久影院 | 奇米影视亚洲狠狠色 | 日本精品久久久久久久久免费 | 四虎影免看黄 | 嗯啊在线观看免费影院 | 亚洲第一永久色 | 国产乱子伦在线观看不卡 | 甜性涩爱 | 国产高清国内精品福利色噜噜 | 色一级| 亚洲色图第四页 | 色橹橹 |