AJAX是什么值桩?

歷史上發(fā)送請(qǐng)求的方式
  • 用 form 可以發(fā)請(qǐng)求羡疗,但是會(huì)刷新頁面或新開頁面
  • 用 a 可以發(fā) get 請(qǐng)求染服,但是也會(huì)刷新頁面或新開頁面
  • 用 img 可以發(fā) get 請(qǐng)求,但是只能以圖片的形式展示
  • 用 link 可以發(fā) get 請(qǐng)求叨恨,但是只能以 CSS柳刮、favicon 的形式展示
  • 用 script 可以發(fā) get 請(qǐng)求,但是只能以腳本的形式運(yùn)行
    注意:以上除了form特碳,都只能發(fā)get請(qǐng)求
有沒有什么方式可以實(shí)現(xiàn):

1.get诚亚、post、put午乓、delete 請(qǐng)求都行
2.想以什么形式展示就以什么形式展示


XMLHttpRequest的發(fā)明

微軟當(dāng)時(shí)取得了重大突破:
IE 5 率先在 JS 中引入 ActiveX 對(duì)象(API)站宗,使得 JS 可以直接發(fā)起 HTTP 請(qǐng)求。
隨后 Mozilla益愈、 Safari梢灭、 Opera 也跟進(jìn)了,取名 XMLHttpRequest蒸其,并被納入 W3C 規(guī)范


AJAX

Jesse James Garrett 將下面的技術(shù)取名叫做 AJAX:異步的 JavaScript 和 XML (async JavaScript and XML)

1.使用XMLHttpRequest發(fā)請(qǐng)求
2.服務(wù)器返回XML格式的字符串
3.JS解析XML敏释,并局部更新頁面

        let request = new XMLHttpRequest()
        // 盡量放在最上面,這樣就不會(huì)錯(cuò)過任何變化
        // 如果放在request.send()之后摸袁,這時(shí)候readyState已經(jīng)從0變?yōu)?钥顽,就只能捕獲到2,3靠汁,4蜂大。
        request.onreadystatechange = () => {
            if (request.readyState === 4) {
                if (request.status >= 200 && request.status < 300) {
                    console.log('請(qǐng)求成功')
                } else if (request.status >= 400) {
                    console.log('請(qǐng)求失敗')
                }
            }
        }
        //初始化請(qǐng)求
        request.open('GET', '/xxx')
        //發(fā)送請(qǐng)求
        request.send()
readyState:請(qǐng)求的五種狀態(tài)

0: 未打開 open()方法還未被調(diào)用
1: 未發(fā)送 send()方法還未被調(diào)用
2: 已經(jīng)獲取響應(yīng)頭 send()方法已經(jīng)被調(diào)用,響應(yīng)頭和響應(yīng)狀態(tài)已經(jīng)返回
3: 正在下載響應(yīng)體 響應(yīng)體下載中蝶怔;responseText中已經(jīng)獲取了部分?jǐn)?shù)據(jù)
4: 請(qǐng)求完成 整個(gè)請(qǐng)求過程完成


JSON

JSON 是一門抄襲/借鑒 JavaScript 的語言奶浦,同時(shí)也是一種數(shù)據(jù)交互格式,JSON 是 JavaScript 的子集(或者說 JSON 只抄襲了一部分 JavaScript 語法踢星,而且沒有新增任何原創(chuàng)的語法)

區(qū)別:SON 不支持函數(shù)澳叉、undefined、變量沐悦、引用成洗、單引號(hào)字符串、對(duì)象的key不支持單引號(hào)也不支持不加引號(hào)藏否、沒有內(nèi)置的 Date泌枪、Math、RegExp 等秕岛。而 JavaScript 全都支持碌燕。

JavaScript JSON
undefined
null null
[ 'a', 'b' ] [ "a", "b" ]
'keller' "keller"
{ name: 'keller' } { "name": "keller" }
function fn() {}
var a = {}; a.self = a
__proto__

那么現(xiàn)在再結(jié)合前后端一起看一下代碼

前端代碼

      myButton.addEventListener('click', (e) => {
            let request = new XMLHttpRequest()
            request.open('get', '/xxx') // 配置request
            request.send()
            request.onreadystatechange = () => {
                if (request.readyState === 4) {
                    console.log('請(qǐng)求響應(yīng)都完畢了')
                    console.log(request.status)
                    if (request.status >= 200 && request.status < 300) {
                        console.log('說明請(qǐng)求成功')
                        console.log(typeof request.responseText)
                        console.log(request.responseText)
                        let string = request.responseText
                        // 把符合 JSON 語法的字符串
                        // 轉(zhuǎn)換成 JS 對(duì)應(yīng)的值
                        let object = window.JSON.parse(string)
                        // JSON.parse 是瀏覽器提供的
                        console.log(typeof object)
                        console.log(object)
                        console.log('object.note')
                        console.log(object.note)

                    } else if (request.status >= 400) {
                        console.log('說明請(qǐng)求失敗')
                    }

                }
            }
        })

后端代碼:

      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')
            response.write(`
                {
                    "note":{
                        "to": "frank",
                        "from": "keller",
                        "heading": "打招呼",
                        "content": "hello"
                    }
                }
            `)
            response.end()
        }

同源策略和CORS跨域

同源策略的本質(zhì)是:一個(gè)域名的JS误证,在未經(jīng)允許的情況下,不能讀取另一個(gè)域名的內(nèi)容修壕。

只有 協(xié)議+域名+端口 一模一樣才允許發(fā) AJAX 請(qǐng)求
1.http://baidu.com 可以向 http://www.baidu.com發(fā) AJAX 請(qǐng)求嗎愈捅?(不可以)
2.http://baidu.com:80可以向http://baidu.com:81發(fā) AJAX 請(qǐng)求嗎?(不可以)

突破同源策略 === 跨域慈鸠,通過使用JSONP以及CORS可以實(shí)現(xiàn)蓝谨,這里著重介紹CORS

CORS(跨站資源共享): Cross-Origin-Resource-Sharing
通俗理解:CORS 可以告訴瀏覽器,我倆一家的青团,別阻止他
實(shí)現(xiàn)方式:讓目標(biāo)站點(diǎn)的后端程序員在相應(yīng)API的響應(yīng)頭里添加以下代碼(切記不要在全網(wǎng)站加譬巫,需要哪個(gè)API,就在哪個(gè)API里加)

后端代碼如下:

    //允許http://keller.com:8001向我發(fā)起請(qǐng)求
    response.setHeader('Access-Control-Allow-Origin', 'http://keller.com:8001') 
    //允許所有域名向我發(fā)起請(qǐng)求  
    response.setHeader('Access-Control-Allow-Origin', '*')
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末督笆,一起剝皮案震驚了整個(gè)濱河市芦昔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌娃肿,老刑警劉巖咕缎,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異料扰,居然都是意外死亡凭豪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門晒杈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嫂伞,“玉大人,你說我怎么就攤上這事拯钻√” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵说庭,是天一觀的道長(zhǎng)然磷。 經(jīng)常有香客問我郑趁,道長(zhǎng)刊驴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任寡润,我火速辦了婚禮捆憎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘梭纹。我一直安慰自己躲惰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布变抽。 她就那樣靜靜地躺著础拨,像睡著了一般氮块。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诡宗,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天滔蝉,我揣著相機(jī)與錄音,去河邊找鬼塔沃。 笑死蝠引,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛀柴。 我是一名探鬼主播螃概,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鸽疾!你這毒婦竟也來了吊洼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤肮韧,失蹤者是張志新(化名)和其女友劉穎融蹂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弄企,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡超燃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拘领。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片意乓。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖约素,靈堂內(nèi)的尸體忽然破棺而出届良,到底是詐尸還是另有隱情,我是刑警寧澤圣猎,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布士葫,位于F島的核電站,受9級(jí)特大地震影響送悔,放射性物質(zhì)發(fā)生泄漏慢显。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一欠啤、第九天 我趴在偏房一處隱蔽的房頂上張望荚藻。 院中可真熱鬧,春花似錦洁段、人聲如沸应狱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疾呻。三九已至除嘹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岸蜗,已是汗流浹背憾赁。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留散吵,地道東北人龙考。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像矾睦,于是被迫代替她去往敵國(guó)和親晦款。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5枚冗? 答:HTML5是最新的HTML標(biāo)準(zhǔn)缓溅。 注意:講述HT...
    kismetajun閱讀 27,486評(píng)論 1 45
  • 如何發(fā)請(qǐng)求? 用 form 可以發(fā)請(qǐng)求赁温,但是會(huì)刷新頁面或新開頁面用 a 可以發(fā) get 請(qǐng)求坛怪,但是也會(huì)刷新頁面或新...
    tsl1127閱讀 348評(píng)論 0 0
  • 之前寫了一篇博客理解JSONP 上關(guān)于AJAX出現(xiàn)之前如何發(fā)請(qǐng)求簡(jiǎn)單回顧一下: 1.用 form 可以發(fā)請(qǐng)求,缺點(diǎn)...
    不討喜的大雄閱讀 481評(píng)論 0 0
  • 1.ajax 是什么: AJAX是異步的JavaScript和XML(Asynchronous JavaScrip...
    亭東云漫閱讀 854評(píng)論 0 0
  • 人人都說自己會(huì) AJAX居灯,那么你能說清楚什么是 AJAX 嗎?----------------簡(jiǎn)單一句話内狗,AJAX...