前端JS基礎(chǔ)九(Ajax)

XMLHttpRequest

  var xhr = new XMLHttpRequest()
  //創(chuàng)建一個(gè)新的http請(qǐng)求倚评,打開(kāi)請(qǐng)求头镊。(方式get/post隅要,url地址,是否異步)
  xhr.open("GET",url,false)
  //onreadystatechange 指定當(dāng)readyState屬性改變時(shí)的事件處理句柄隐砸。
  //也就是每次readyState屬性改變時(shí)都會(huì)觸發(fā)這個(gè)函數(shù)
  xhr.onreadystatechange = function(){
    if(xhr.readyState === 4 && xhr.status === 200){
        //將響應(yīng)信息作為字符串返回
        alert(xhr.responseText)
    }
  }
  xhr.send(null)

注:IE兼容性問(wèn)題
IE低版本使用ActiveXObject膝捞,和W3C標(biāo)準(zhǔn)不一樣

狀態(tài)碼

readyState
  • 0-(未初始化)還沒(méi)調(diào)用send()方法
  • 1-(載入)已調(diào)用send()方法鹰溜,正在發(fā)送請(qǐng)求
  • 2-(載入完成)send()方法執(zhí)行完畢架忌,已經(jīng)接收到全部的響應(yīng)內(nèi)容
  • 3-(交互)正在解析響應(yīng)內(nèi)容
  • 4-(完成)響應(yīng)內(nèi)容解析完成吞彤,可以在客戶(hù)端調(diào)用了
status
  • 2xx-表示成功處理請(qǐng)求。如200
  • 3xx-需要重定向叹放,瀏覽器直接跳轉(zhuǎn)
  • 4xx-客戶(hù)端請(qǐng)求錯(cuò)誤饰恕,如404
  • 5xx-服務(wù)器端錯(cuò)誤,如500

跨域

什么是跨域
  • 瀏覽器有同源策略井仰,不允許Ajax訪問(wèn)其他域接口
    跨域條件:協(xié)議懂盐、域名、端口糕档,有一個(gè)不同就算跨域

  • 有三個(gè)標(biāo)簽允許加載跨域資源
    <img src=xxx>
    <link href=xxx>
    <script src=xxx>

  • 三個(gè)標(biāo)簽的應(yīng)用場(chǎng)景
    <img> 用于打點(diǎn)統(tǒng)計(jì) 其他域的統(tǒng)計(jì)網(wǎng)站
    <link> <script> 可以使用來(lái)自其他域的CDN
    <script> 可以用于JSONP

  • 跨域注意事項(xiàng)
    所有的跨域請(qǐng)求都必須經(jīng)過(guò)信息提供方允許
    如果未經(jīng)允許即可獲得,那是瀏覽器同源策略出現(xiàn)漏洞

JSONP
  • JSONP實(shí)現(xiàn)原理
    假如加載http://www.zhibu.com/index.html
    不一定服務(wù)端就真的存在一個(gè)index.html
    服務(wù)端可以根據(jù)請(qǐng)求拌喉,動(dòng)態(tài)生成一個(gè)文件并返回
    同理 <script src="http://www.zhibu.com/api.js"> 也是如此
    假如你的網(wǎng)站要跨域訪問(wèn)知乎的一個(gè)接口
    知乎給你一個(gè)地址 http://www.zhibu.com/api.js
    返回內(nèi)容格式如callback({x:100, y:200}) (是動(dòng)態(tài)生成的)
  <script>
  window.callback = function(data){
    //跨域得到的信息
    console.log(data)
  }
  </script>
  <script src="http://www.zhihu.com/api.js"></script>
  <!-- eg: 以上將返回callback({x:100,y:200}) -->
服務(wù)器端設(shè)置 http header
  • 服務(wù)器端設(shè)置http header是另外一個(gè)解決跨域的簡(jiǎn)潔方法速那,需要在服務(wù)器端操作。但是作為前端也要了解這個(gè)方法尿背,這是將來(lái)解決跨域問(wèn)題的一個(gè)趨勢(shì)端仰。
//注意 不同后端語(yǔ)言的寫(xiě)法不同
//第二個(gè)參數(shù)填寫(xiě)允許跨域的域名稱(chēng) 不建議直接寫(xiě)*
response.setHeader("Access-Control-Allow-Origin","http://a.com, http://b.com");
response.setHeader("Access-Control-Allow-Headers","X-Request-With");
response.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");

//接受跨域的cookie
response.setHeader("Access-Control-Allow-Credentials","true");

練習(xí)題

練習(xí)題1、手動(dòng)編寫(xiě)一個(gè)ajax田藐,不依賴(lài)第三方庫(kù)
  // 指定了請(qǐng)求目標(biāo)荔烧,也明確了如何處理之后,就可以發(fā)送請(qǐng)求了
  var request = new XMLHttpRequest();
  // 指定請(qǐng)求目標(biāo)汽久,三個(gè)參數(shù), GET or POST, 請(qǐng)求路徑 , 是否異步(默認(rèn)true鹤竭,可以不寫(xiě))
  request.open('GET',url,true);
  request.onreadystatechange() = function(){
      if(request.readyState === 4){
          // 請(qǐng)求完成
          if(request.status === 200){
              // 請(qǐng)求成功,獲得一個(gè)成功的響應(yīng),此后可以開(kāi)始請(qǐng)求成功后的處理
              //responseText 保存文本字符串格式
              request.responseText
              //responseXML 保存 Content-Type 頭部中指定為 "text/html" 的數(shù)據(jù)
              request.responseXML
          }else{
              // 請(qǐng)求失敗景醇,根據(jù)響應(yīng)碼判斷失敗原因
              console.log('error,status:'+request.status)
          }
      }else{
          // 請(qǐng)求還在繼續(xù)
      }
  }

練習(xí)題2臀稚、跨域的幾種實(shí)現(xiàn)方式
  JSONP
  服務(wù)器端設(shè)置http header
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市三痰,隨后出現(xiàn)的幾起案子吧寺,更是在濱河造成了極大的恐慌,老刑警劉巖散劫,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稚机,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡获搏,警方通過(guò)查閱死者的電腦和手機(jī)赖条,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人谋币,你說(shuō)我怎么就攤上這事仗扬。” “怎么了蕾额?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵早芭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我诅蝶,道長(zhǎng)退个,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任调炬,我火速辦了婚禮语盈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缰泡。我一直安慰自己刀荒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布棘钞。 她就那樣靜靜地躺著缠借,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宜猜。 梳的紋絲不亂的頭發(fā)上泼返,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音姨拥,去河邊找鬼绅喉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛叫乌,可吹牛的內(nèi)容都是我干的柴罐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼憨奸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼丽蝎!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起膀藐,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤屠阻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后额各,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體国觉,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年虾啦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了麻诀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痕寓。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蝇闭,靈堂內(nèi)的尸體忽然破棺而出呻率,到底是詐尸還是另有隱情,我是刑警寧澤呻引,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布礼仗,位于F島的核電站,受9級(jí)特大地震影響逻悠,放射性物質(zhì)發(fā)生泄漏元践。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一童谒、第九天 我趴在偏房一處隱蔽的房頂上張望单旁。 院中可真熱鬧,春花似錦饥伊、人聲如沸象浑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)愉豺。三九已至,卻和暖如春趋距,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背越除。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工节腐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摘盆。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓翼雀,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親孩擂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子狼渊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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