初探AJAX

AJAX 是一種在無需重新加載整個網(wǎng)頁的情況下举娩,能夠更新部分網(wǎng)頁的技術(shù)艘希。

如何發(fā)送請求

常用的五種方法

  • form表單可以發(fā)發(fā)送GET和POST請求請求促绵,但是會刷新頁面或新開頁面
<body>
<form action="xxx" method=get>  //get或post
    <input type="password" name="password">
    <input type="sumbit">
</form>
<body>

查看get/post的路徑到開發(fā)者工具看死遭,記得點view source才能查看路徑鞠眉。

  • a標(biāo)簽可以發(fā)get請求澄峰,但是也會刷新頁面或新開頁面
  • img可以發(fā) get 請求嫉沽,但是只能以圖片的形式展示
  • link可以發(fā) get 請求,但是只能以CSS俏竞、favicon 的形式展示绸硕,而且必須放到頁面里面
  • script可以發(fā) get 請求,但是只能以腳本的形式運行

上面的方法雖然都是可以發(fā)起請求魂毁,但是太限制了玻佩。那么,有沒有什么方式可以實現(xiàn):

  • get席楚、post咬崔、put、delete 請求都行
  • 想以什么形式展示就以什么形式展示

有的烦秩,就是XMLHttpRequestAPI

這個API是IE 5 率先在 JS 中引入 ActiveX 對象(API)垮斯,使得 JS 可以直接發(fā)起 HTTP 請求。
隨后 Mozilla只祠、 Safari兜蠕、 Opera 也跟進(jìn)了,取名XMLHttpRequest 抛寝,并被納入 W3C 規(guī)范.

XMLHttpRequest是一個函數(shù)熊杨,而且是一個構(gòu)造函數(shù),它是window下的一個全局對象

AJAX(async javascript and XML)

Jesse James Garrett 講如下技術(shù)取名叫做 AJAX:異步的 JavaScript 和 XML.

使用 XMLHttpRequest對象的open方法發(fā)送HTTP請求

 myButton=addEventListener('click',(e)=>{
   let request=new XMLHttpRequest() //聲明XMLHttpRequest對象
   request.open('GET','/xxx') //初始化request
   request.send()
 })

這里有個有趣的點盗舰,就是即使把open()的method參數(shù)換成fuck晶府,我們一樣可以發(fā)起請求,但服務(wù)器不接收~


服務(wù)器返回 XML 格式的字符串

這種格式應(yīng)該是已經(jīng)失傳了的钻趋,但是我們可以嘗試做一下

} else if(path==='/xxx'){
        response.statusCode=200
        response,setHeader('Content-Type','text/xml')
        response.write(`
          <?xml version="1.0" encoding="UTF-8"?>
            <note>
              <to>Tove</to>
              <from>phoebe</from>
              <heading>Reminder</heading>
              <body>hello,World!</body>
            </note>
          `)
        response.end()

這種格式現(xiàn)在很少前端會再使用了川陆,原因是:

  • XML文件龐大,文件格式復(fù)雜爷绘,傳輸占帶寬书劝;
  • 服務(wù)器端和客戶端都需要花費大量代碼來解析XML进倍,導(dǎo)致服務(wù)器端和客戶端代碼變得異常復(fù)雜且不易維護(hù);
  • 客戶端不同瀏覽器之間解析XML的方式不一致购对,需要重復(fù)編寫很多代碼猾昆;
  • 服務(wù)器端和客戶端解析XML花費較多的資源和時間。

XMLHttpRequest實例的屬性

  • readyState

這個屬性存有 XMLHttpRequest 的狀態(tài)信息骡苞。

一般我們需要熟記狀態(tài)4即可垂蜗。

  • readystatechange

每當(dāng) readyState 屬性改變時,就會觸發(fā) onreadystatechange 事件解幽,調(diào)用該函數(shù)贴见。

  • responseText

這個屬性返回從服務(wù)器接收到的字符串,它包含對文本的請求的響應(yīng)躲株,如果請求不成功或尚未發(fā)送片部,則返回null。

JSON(數(shù)據(jù)交換語言)

語法

JavaScript Json
undefined 沒有undefined
null null
['a','b'] ["a","b"]
function fn(){} 沒有function
{name:'phoebe'} {"name":"phoebe"}
'phoebe' "phoebe"
var a={} a.self=a 搞不定(沒有變量)
{--proto--} 沒有原型鏈

JavaScript和Json的區(qū)別

JavaScript Json
undefined 沒有undefined
null null
['a','b'] ["a","b"]
function fn(){} 沒有function
{name:'phoebe'} {"name":"phoebe"}
'phoebe' "phoebe"
var a={} a.self=a 搞不定(沒有變量)
{--proto--} 沒有原型鏈
  • JSON沒有引進(jìn)JavaScript的functionundefined
  • JSON的字符串首尾必須是""
} else if(path==='/xxx'){
response.statusCode=200
response,setHeader('Content-Type','text/xml')
response.write(`
{
  "note":{
    "to":"小谷"霜定,
    "from":"方方"档悠,
    "heading":"打招呼",
    "content":"hi"
  }
}  
  `)
//注意望浩!這是返回一段字符串辖所,不是返回對象。這是一段符合json對象語法的字符串
myButton=addEventListener('click',(e)=>{
  let request=new XMLHttpRequest() //聲明XMLHttpRequest對象
  request.open('GET','/xxx') 
  request.send()
  request.onreadystatechange=()=>{
    if (request.readyState===4){
        console.log('請求響應(yīng)都完畢了')
        if (request.status>=200&&request.status<300) {
            let string=request.responseText
            //把符合JSON的語法的字符串轉(zhuǎn)換成JS對應(yīng)的值
            let object=window.JSON.pare(string)
            //JSON.parse 是瀏覽器提供的
        }else if(request.status>=400){
            console.log('說明請求失敗了')
        }
    }
  }
})

同源政策

瀏覽器必須保證只有協(xié)議+端口+域名一模一樣才允許發(fā) AJAX 請求

例:

http://baidu.com 可以向 http://www.baidu.com 發(fā) AJAX 請求嗎? no

http://baidu.com:80 可以向 http://baidu.com:81 發(fā) AJAX 請求嗎? no

AJAX

語法

  let request = new XMLHttpRequest()
  request.open('get', 'http://jack.com:8002/xxx') // 配置request
  request.send()
  request.onreadystatechange = ()=>{
    if(request.readyState === 4){
      if(request.status >= 200 && request.status < 300){
        let string = request.responseText
        // 把符合 JSON 語法的字符串轉(zhuǎn)換成 JS 對應(yīng)的值
        let object = window.JSON.parse(string) 
        // JSON.parse 是瀏覽器提供的
      }
    }
  }
})

使用AJAX實現(xiàn)兩個網(wǎng)站之間的交流(跨站資源共享)

只需在后臺代碼使用CORS(cross-origin resource sharing) 跨域請求

response.setHeader('Access-Control-Allow-Origin','http://frank.com:8001')

//后臺代碼
  } else if(path==='/xxx'){
    response.statusCode=200
    response,setHeader('Content-Type','text/json;charset=utf-8')
    response.setHeader('Access-Control-Allow-Origin','http://frank.com:8001') //響應(yīng)頭磨德。CORS 跨域
    response.write(`
    {
      "note":{
        "to":"小谷"缘回,
        "from":"方方",
        "heading":"打招呼"典挑,
        "content":"hi"
      }
    }  
      `)//注意酥宴!這是返回一段字符串,不是返回對象您觉。這是一段符合json對象語法的字符串
    response.end()

若是想要實現(xiàn)所有網(wǎng)站都可訪問幅虑,只需

`response.setHeader('Access-Control-Allow-Origin','http://frank.com:8001',*)`
//在末尾加*
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市顾犹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌褒墨,老刑警劉巖炫刷,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異郁妈,居然都是意外死亡浑玛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門噩咪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顾彰,“玉大人极阅,你說我怎么就攤上這事≌窍恚” “怎么了筋搏?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長厕隧。 經(jīng)常有香客問我奔脐,道長,這世上最難降的妖魔是什么吁讨? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任髓迎,我火速辦了婚禮,結(jié)果婚禮上建丧,老公的妹妹穿的比我還像新娘排龄。我一直安慰自己,他們只是感情好翎朱,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布橄维。 她就那樣靜靜地躺著,像睡著了一般闭翩。 火紅的嫁衣襯著肌膚如雪挣郭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天疗韵,我揣著相機(jī)與錄音兑障,去河邊找鬼。 笑死蕉汪,一個胖子當(dāng)著我的面吹牛流译,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播者疤,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼福澡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了驹马?” 一聲冷哼從身側(cè)響起革砸,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糯累,沒想到半個月后算利,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡泳姐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年效拭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡缎患,死狀恐怖慕的,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挤渔,我是刑警寧澤肮街,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站蚂蕴,受9級特大地震影響低散,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骡楼,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一熔号、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸟整,春花似錦引镊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涉茧,卻和暖如春赴恨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伴栓。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工伦连, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钳垮。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓惑淳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饺窿。 傳聞我的和親對象是個殘疾皇子歧焦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354