第十周第二天筆記

1 jsonp

1.1 script預(yù)解釋

  • 基礎(chǔ)知識:
    • 每一個script指的就是一個獨(dú)立的域甘邀,不同的script代表不同的域受啥;
    • 兩個不同的域之間函數(shù)的調(diào)用注暗,必須使函數(shù)定義階段的域先引入季眷,然后函數(shù)調(diào)用的函數(shù)的域后引入冕臭;順序相反不能拿到數(shù)據(jù)腺晾;
     //1. 函數(shù)定義階段的域先引入瓢棒,函數(shù)執(zhí)行階段的域后引入,此時執(zhí)行正確丘喻,彈出123脯宿;
     <body>
     <script>
         function fn() {
             alert(123);
         }
     </script>
     <script>
         fn();
     </script>
     </body>
    
     //2. 函數(shù)執(zhí)行階段的域先引入,函數(shù)定義階段的域后引入泉粉,此時執(zhí)行會報(bào)錯连霉,即:fn is not defined;
     <body>
     <script>
         fn();
     </script>
     <script>
         function fn() {
             alert(123);
         }
     </script>
     </body>
    

1.2 jsonp原理

  • jsonp原理體驗(yàn):
    • jsonp的原理:通過一個script建立一個獨(dú)立的域嗡靡,這個域的請求地址為百度的一個服務(wù)器跺撼,通過wd的值來查找數(shù)據(jù),然后去將數(shù)據(jù)作為一個實(shí)參讨彼,傳入到cb后面的函數(shù)中歉井,執(zhí)行cb后面函數(shù)名的函數(shù);
    • jsonp請求的實(shí)質(zhì)是獲取百度服務(wù)器中數(shù)據(jù)庫中的數(shù)據(jù)哈误,作為實(shí)參傳入到全局函數(shù)中哩至;獲取數(shù)據(jù)的方式:在百度所搜框中輸入文字后,在控制臺中的network中會生成數(shù)據(jù)蜜自,然后找到帶su?wd=的地址后菩貌,在新的頁面中打開,就會看到數(shù)據(jù)重荠;然后刪除沒用的地址數(shù)據(jù)箭阶;設(shè)置cb的值為全局函數(shù)名即可煎饼;
    • jsonp請求的三步:
      1. 定義一個有名字的全局函數(shù)僵缺,作為cd后面的函數(shù)名细卧;
      2. 在全局函數(shù)中設(shè)置形參看尼,獲取實(shí)參數(shù)據(jù)歪玲;
      3. 通過script發(fā)送請求:通過script來創(chuàng)建一個域载矿,src賦值中包括(url?參數(shù)&cb=函數(shù)名)惧盹,在域中絮记,執(zhí)行cb后面的函數(shù)鸣皂,給函數(shù)傳入一個實(shí)參數(shù)據(jù)抓谴;
     <!DOCTYPE html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <title>jsonp體驗(yàn)</title>
     </head>
     <body>
     <script>
         window["xhfd"]=function(data) {
             console.log(data);
         }
     </script>
     <!--請求步驟:在url這個請求地址中,通過wd后面的賦值來進(jìn)行查找寞缝,查找到的數(shù)據(jù)作為實(shí)參傳入到cb后面的函數(shù)中執(zhí)行-->
     <script src="https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=zhouxingchi&cb=xhfd"></script>
     </body>
     </html>
    

2 ajax封裝

  • jQuery中ajax體驗(yàn)
    • 注意:在百度服務(wù)器中搜索獲取地址后癌压,向一個函數(shù)中傳入實(shí)參數(shù)據(jù),執(zhí)行函數(shù)荆陆,必須設(shè)置jsonp參數(shù)為cb滩届,cb設(shè)置的函數(shù)名為默認(rèn)的jQuery...;
     <!DOCTYPE html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <title>jQuery中jsonp體驗(yàn)</title>
     </head>
     <body>
     <script src="jquery.js"></script>
     <script>
         //https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=zhouxingchi&cb=xxx
         //分析:問號之前的為請求地址;wd等號后為搜索的內(nèi)容被啼;cd后面為調(diào)用函數(shù)的函數(shù)名帜消;
         $.ajax({
             url:"https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su",//請求地址棠枉;后臺接口
             data:{"wd":"扶搖"},//前端傳給后臺的數(shù)據(jù),可有可無的泡挺;
             type:"get",//請求方式辈讶,post,get,jsonp可有可無,如果寫了jsonp娄猫,沒寫默認(rèn)的都是get贱除;
             dataType: "jsonp",//返回的數(shù)據(jù)類型,可有可無的媳溺,如果傳了月幌,拿到的數(shù)據(jù)就是josn對象,如果沒有悬蔽,拿到的是字符串
             jsonp:"cb",//可有可無扯躺,沒有,默認(rèn)是callback蝎困;但在百度服務(wù)器中搜索必須設(shè)置為cb
             fnLoading:function(){//等待加載
                 console.log("數(shù)據(jù)正在加載中录语,請耐心等待");
             },
             complete:function(){//加載完成
                 console.log("數(shù)據(jù)請求結(jié)束")
             },
             success:function(data){//數(shù)據(jù)請求成功
                 console.log(data);
             },
             error:function (data) {//數(shù)據(jù)請求失敗
                 //數(shù)據(jù)請求失敗的處理;
             },
             timeout:2000//請求超時难衰,可有可無钦无,沒傳默認(rèn)3000;
         })
     </script>
     </body>
     </html>
    
  • 封裝myAjax函數(shù)
    • 參數(shù):ajax({url:xxx,data:xxx,type:xxx,dataType:xxx,jsonp:xxx,fnLoading:xxx,complete:xxx,success:xxx,error:xxx,timeout})逗栽;
    • 思路:
      • 獲取參數(shù)盖袭;
      • 獲取數(shù)據(jù)的四步
        1. 創(chuàng)建一個xml對象:需注意的是IE6瀏覽器下不兼容,需要做兼容處理
        2. 打開地址
        3. 發(fā)送請求
          • 通過switch來創(chuàng)建不同情況下的設(shè)置
          • get請求:參數(shù)在地址中彼宠,在url?的后面鳄虱,以鍵值對的形式連接;
          • post請求:參數(shù)在請求體中凭峡,地址url后面不跟參數(shù)拙已;
          • jsonp請求:與get和post兩種形式不同,獨(dú)立設(shè)置
        • jsonp請求的步驟
          • 新建一個全局變量摧冀,作為函數(shù)名倍踪,注意函數(shù)名中不能存在小數(shù)點(diǎn);
          • 創(chuàng)建一個全局函數(shù)索昂,函數(shù)中設(shè)置形參建车,用于獲取實(shí)參;
          • 新建一個script標(biāo)簽椒惨,插入到body的最后面缤至,用于發(fā)送請求,其中src值的形式為:url?參數(shù)&cb=函數(shù)名
        1. 響應(yīng)請求
          • 響應(yīng)請求前可以添加fnLoading函數(shù)康谆;
          • 添加請求事件后判斷xml.readyState===4成立后领斥,代表請求成功嫉到,可以設(shè)置執(zhí)行complete函數(shù);
          • 通過正則校驗(yàn)xml.status的狀態(tài)碼是否為2xx
            • 如果校驗(yàn)成功月洛,代表響應(yīng)成功何恶,執(zhí)行success函數(shù);執(zhí)行函數(shù)前嚼黔,判斷需要返回的類型导而,然后傳入響應(yīng)的實(shí)參給函數(shù);
            • 如果校驗(yàn)失敗隔崎,則返回狀態(tài)碼給error函數(shù)今艺;
      • 添加等待超時判斷
        • 添加定時器,判斷在指定timeout時間內(nèi)爵卒,是否響應(yīng)成功虚缎,如果未成功,執(zhí)行定時器函數(shù)钓株,彈出信息实牡;
        • 注:在定時器前面判斷是否為jsonp執(zhí)行,如果是的話轴合,阻斷程序執(zhí)行创坞,不執(zhí)行定時器;
    • 注意:
      • 使用時受葛,設(shè)置對象中的屬性data時题涨,用對象的形式設(shè)置;利用json2url函數(shù)总滩,將對象轉(zhuǎn)換為字符串格式為"key=val&key=val"形式纲堵;
      • 封裝的get和post只能在本地獲取數(shù)據(jù),不能跨域獲热蛴妗席函;跨域獲取用jsonp請求;
    • 代碼:
      • 執(zhí)行代碼:
       <!DOCTYPE html>
       <html lang="en">
       <head>
           <meta charset="UTF-8">
           <title>封裝的ajax</title>
       </head>
       <body>
       <script src="JS/ajax.js"></script>
       <script>
           myAjax({
               url:"https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su",
               data:{wd:"zhouxingchi"},
               type:"jsonp",
               dataType:"json",
               jsonp:"cb",//此處必須設(shè)置jsonp為cb冈涧,才能使用
               success:function (data) {
                   console.log(data);
               }
           });
       </script>
       </body>
       </html>
      
      • 封裝JS代碼:
       //參數(shù):ajax({url:xxx,data:xxx,type:xxx,dataType:xxx,jsonp:xxx,fnLoading:xxx,complete:xxx,success:xxx,error:xxx,timeout})
       //將對象中的屬性名和屬性值轉(zhuǎn)化為key=val&key=val的形式
       function json2url(obj) {
           //參數(shù):對象茂附,返回值:字符串
           //思路:對象-數(shù)組-字符串
           obj.t=Math.random();//避免緩存
           var ary=[];
           //遍歷對象
           for(var attr in obj){
               ary.push(attr+"="+obj[attr]);
           }
           return ary.join("&");
       }
       function jsonParse(strJson) {
           return "JSON" in window?JSON.parse(strJson):eval("("+strJson+")");
       }
       function myAjax(json) {
           json=json||{};
           //如果json中請求地址url不存在
           if(!json.url) return;
           //參數(shù)獲取
           var url=json.url;
           //data屬性值為一個對象,對象中為參數(shù)
           var data=json.data||{};
           var type=json.type||"get";
           var jsonp=json.jsonp||"callback";
           var timeout=json.timeout||3000;
           var timer=null;
           //四步:
           //1 創(chuàng)建一個xml對象
           //每個類函數(shù)都是window的一個屬性督弓;
           if(window.XMLHttpRequest){
               var xml=new XMLHttpRequest();
           }else{//IE6兼容處理
               var xml=new ActiveXObject("Microsoft.XMLHTTP");
           }
           //2 打開地址营曼;3 發(fā)送請求
           //get請求:參數(shù)在地址中,在url?的后面咽筋,以鍵值對的形式連接溶推;
           //post請求:參數(shù)在請求體中,地址url后面不跟參數(shù);
           switch(type.toLowerCase()){
               case "get":
                   xml.open("get",url+"?"+json2url(data),true);
                   xml.send(null);
                   break;
               case "post":
                   xml.open("post",url,true);
                   xml.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                   xml.send(json2url(data));
                   break;
               case "jsonp":
                   //新建一個全局函數(shù)
                   var kbfd="jsonp_"+Math.random();
                   kbfd=kbfd.replace(".","");//函數(shù)名中不能存在小數(shù)點(diǎn)蒜危,所以需要替換
                   window[kbfd]=function (data) {
                       json.success && json.success(data);
                       //卸磨殺驢虱痕,干掉script
                       document.body.removeChild(oS);
                       //將oS賦值為null;
                       oS=null;
                   };
                   data[jsonp]=kbfd;
                   //創(chuàng)建script標(biāo)簽,設(shè)置其src辐赞,通過script發(fā)送請求
                   var oS=document.createElement("script");
                   //script中src包含url?參數(shù)&cb=kbfd
                   oS.src=url+"?"+json2url(data);
                   //script必須插入到頁面的底部
                   document.body.appendChild(oS);
                   break;
           }
           //響應(yīng)請求之前的準(zhǔn)備
           json.fnLoading && json.fnLoading();
           //4 響應(yīng)請求
           xml.onreadystatechange=function () {
               if(xml.readyState===4){
                   //請求成功
                   json.complete && json.complete();
                   clearTimeout(timer);
                   //判斷后臺響應(yīng)成功還是失敳壳獭;
                   if(/^2\d{2}$/.test(xml.status)){//響應(yīng)成功
                       if(json.dataType==="json"){
                           json.success && json.success(jsonParse(xml.responseText));
                       }else{
                           json.success && json.success(xml.responseText);
                       }
                   }else{//響應(yīng)失敗
                           json.error && json.error(xml.status);
                   }
               }
       
           };
           if(type==="jsonp") return;
           //5 等待超時
           timer=setTimeout(function () {
               alert("您的網(wǎng)絡(luò)不行啊");
               xml.onreadystatechange=null;
           },timeout);
       }
      
  • 知識點(diǎn)
    • 類是window的屬性
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末响委,一起剝皮案震驚了整個濱河市新思,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赘风,老刑警劉巖夹囚,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異邀窃,居然都是意外死亡荸哟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門瞬捕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鞍历,“玉大人,你說我怎么就攤上這事肪虎×涌常” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵扇救,是天一觀的道長刑枝。 經(jīng)常有香客問我,道長爵政,這世上最難降的妖魔是什么仅讽? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮钾挟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饱岸。我一直安慰自己掺出,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布苫费。 她就那樣靜靜地躺著汤锨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪百框。 梳的紋絲不亂的頭發(fā)上闲礼,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼柬泽。 笑死慎菲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锨并。 我是一名探鬼主播露该,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼第煮!你這毒婦竟也來了解幼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤包警,失蹤者是張志新(化名)和其女友劉穎撵摆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體害晦,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡台汇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了篱瞎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苟呐。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖俐筋,靈堂內(nèi)的尸體忽然破棺而出牵素,到底是詐尸還是另有隱情,我是刑警寧澤澄者,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布笆呆,位于F島的核電站,受9級特大地震影響粱挡,放射性物質(zhì)發(fā)生泄漏赠幕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一询筏、第九天 我趴在偏房一處隱蔽的房頂上張望榕堰。 院中可真熱鬧,春花似錦嫌套、人聲如沸逆屡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽魏蔗。三九已至,卻和暖如春痹筛,著一層夾襖步出監(jiān)牢的瞬間莺治,已是汗流浹背廓鞠。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谣旁,地道東北人床佳。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像蔓挖,于是被迫代替她去往敵國和親夕土。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5瘟判? 答:HTML5是最新的HTML標(biāo)準(zhǔn)怨绣。 注意:講述HT...
    kismetajun閱讀 27,486評論 1 45
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,403評論 1 92
  • 第一章 入門 基本功能:訪問和操作 dom 元素拷获,控制頁面樣式篮撑,對頁面的事件處理,與ajax完美結(jié)合匆瓜,有豐富的插件...
    X_Arts閱讀 1,045評論 0 2
  • 親愛的自己: 30歲了呢赢笨,今天你開心嗎,你在做什么驮吱,你喜歡現(xiàn)在的生活嗎茧妒?有沒有人在你身邊。 我在23歲的今天寫信給...
    我家樓下閱讀 264評論 0 0
  • 人有三種驅(qū)動力左冬,第一種是生存需要桐筏,是一種動物的本能;第二種是獎勵/懲罰拇砰,這是一種簡單的用金錢梅忌、物質(zhì)來刺激的驅(qū)動方式...
    荒原蒼狼閱讀 191評論 0 0