成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Ajax學(xué)習(xí)與理解

thursday / 1585人閱讀

摘要:也在年發(fā)布了它的國(guó)際標(biāo)準(zhǔn)。能夠返回具體數(shù)字代表看上面的文檔,表示服務(wù)器返回的數(shù)據(jù)已經(jīng)完全接收,或者本次接收已經(jīng)失敗。請(qǐng)求結(jié)束,處理服務(wù)器返回的數(shù)據(jù)顯示提示加載中上面代碼中,等于時(shí),表明腳本發(fā)出的請(qǐng)求已經(jīng)成功。其他情況,都表示請(qǐng)求還在進(jìn)行中。

Ajax學(xué)習(xí)與理解

想要學(xué)習(xí)的Ajax內(nèi)容都在這個(gè)教程阮一峰javascript--XMLHttpRequest 對(duì)象
應(yīng)該注意的點(diǎn)

JS 是一門(mén)語(yǔ)言,JSON 是另一門(mén)語(yǔ)言,JSON 這門(mén)語(yǔ)言抄襲了 JS這門(mén)語(yǔ)言

AJAX 就是用 JS 發(fā)請(qǐng)求

響應(yīng)的第四部分是字符串,可以用 JSON 語(yǔ)法表示一個(gè)對(duì)象,也可以用 JSON 語(yǔ)法表示一個(gè)數(shù)組,還可以用 XML 語(yǔ)法,還可以用 HTML 語(yǔ)法,還可以用 CSS 語(yǔ)法,還可以用 JS 語(yǔ)法,還可以用我自創(chuàng)的語(yǔ)法

1 如何發(fā)請(qǐng)求?

用 form 可以發(fā)請(qǐng)求,但是會(huì)刷新頁(yè)面或新開(kāi)頁(yè)面
用 a 可以發(fā) get 請(qǐng)求,但是也會(huì)刷新頁(yè)面或新開(kāi)頁(yè)面
用 img 可以發(fā) get 請(qǐng)求,但是只能以圖片的形式展示
用 link 可以發(fā) get 請(qǐng)求,但是只能以 CSS、favicon 的形式展示
用 script 可以發(fā) get 請(qǐng)求,但是只能以腳本的形式運(yùn)行

使用form發(fā)送請(qǐng)求,查看請(qǐng)求的內(nèi)容

password=123456就是POST請(qǐng)求的第四部分

那有沒(méi)有什么方式可以實(shí)現(xiàn)

get、post、put、delete 請(qǐng)求都行

想以什么形式展示就以什么形式展示

2 微軟的突破

IE 5 率先在 JS 中引入 ActiveX 對(duì)象(API),使得 JS 可以直接發(fā)起 HTTP 請(qǐng)求(想用getpost都可以,想以什么形式展示就以什么形式展示)。
隨后 Mozilla、 Safari、 Opera 也跟進(jìn)(抄襲)了,取名 XMLHttpRequest(全局對(duì)象),并被納入 W3C 規(guī)范

XMLHttpRequest使得瀏覽器有了和軟件一樣的體驗(yàn),不局限于看文章和刷新

3 AJAX

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

使用 XMLHttpRequest 發(fā)請(qǐng)求

服務(wù)器返回 XML 格式的字符串(因?yàn)楫?dāng)時(shí)XML在當(dāng)時(shí)是流行的數(shù)據(jù)傳輸格式,后來(lái)用json)

JS 解析 XML,并更新局部頁(yè)面

2005年2月,AJAX 這個(gè)詞第一次正式提出,它是 Asynchronous JavaScript and XML 的縮寫(xiě),指的是通過(guò) JavaScript 的異步通信,從服務(wù)器獲取 XML 文檔從中提取數(shù)據(jù),再更新當(dāng)前網(wǎng)頁(yè)的對(duì)應(yīng)部分,而不用刷新整個(gè)網(wǎng)頁(yè)。后來(lái),AJAX 這個(gè)詞就成為 JavaScript 腳本發(fā)起 HTTP 通信的代名詞,也就是說(shuō),只要用腳本發(fā)起通信,就可以叫做 AJAX 通信。W3C 也在2006年發(fā)布了它的國(guó)際標(biāo)準(zhǔn)。

.

具體來(lái)說(shuō),AJAX 包括以下幾個(gè)步驟。

創(chuàng)建 XMLHttpRequest 實(shí)例

發(fā)出 HTTP 請(qǐng)求

接收服務(wù)器傳回的數(shù)據(jù)

更新網(wǎng)頁(yè)數(shù)據(jù)

概括起來(lái),就是一句話(huà),**AJAX 通過(guò)原生的XMLHttpRequest對(duì)象發(fā)出 HTTP
請(qǐng)求,得到服務(wù)器返回的數(shù)據(jù)后,再進(jìn)行處理?,F(xiàn)在,服務(wù)器返回的都是 JSON** 格式的數(shù)據(jù),XML 格式已經(jīng)過(guò)時(shí)了,但是 AJAX
這個(gè)名字已經(jīng)成了一個(gè)通用名詞,字面含義已經(jīng)消失了。

4 如何使用 XMLHttpRequest對(duì)象

所有代碼都在這里
每一次大的更新可以查看commit
服務(wù)器端代碼:

if(path === "/"){
    response.statusCode = 200
    let string = fs.readFileSync("./index.html") 
    response.setHeader("Content-Type", "text/html;charset=utf-8")
    response.write(string)
    response.end()
  }

對(duì)于響應(yīng)來(lái)說(shuō),第四部分始終都是字符串,因?yàn)?b>response.write(string)返回的是字符串,我們給瀏覽器返回了符合html格式的字符串.
然后再設(shè)置響應(yīng)頭中的Content-Type,response.setHeader("Content-Type", "text/html;charset=utf-8"),即要求瀏覽器以HTML的語(yǔ)法解析這段字符串!,所以我們可以設(shè)置瀏覽器使用的解析方法為json,也可設(shè)置為xml.所以JSON 是一門(mén)語(yǔ)言!!

http請(qǐng)求的路徑都是絕對(duì)路徑.所以都是以/開(kāi)頭

4.1開(kāi)始使用

所有代碼都在這里
查看commit既有每次迭代的代碼

我們請(qǐng)求一個(gè)以xml格式解析的字符串,然后看看響應(yīng)是什么
服務(wù)器端代碼

else if (path === "/xxx") {
    response.statusCode = 200
    response.setHeader("Content-Type", "text/xml;charset=utf-8")
    response.write(`
    
      Tove
      Jani
      Reminder
      Don"t forget me this weekend!
    
    `)
    response.end()
  }

main.js

let myButton = document.getElementById("myButton");
myButton.addEventListener("click",(e)=>{
    let request = new XMLHttpRequest();
    request.open("GET","/xxx")//配置request.參數(shù)分別為方法和路徑
    request.send();//發(fā)送請(qǐng)求
})

index.html


    
    

當(dāng)點(diǎn)擊點(diǎn)我按鈕時(shí),查看發(fā)送的請(qǐng)求和收到的響應(yīng):

我們將request打印出來(lái),看看結(jié)構(gòu):
console.log(request)

4.1.2 理解j代碼中的時(shí)間概念

XMLHttpRequest.readyState

XMLHttpRequest.readyState返回一個(gè)整數(shù),表示實(shí)例對(duì)象的當(dāng)前狀態(tài)。該屬性只讀。
能夠返回0,1,2,3,4,具體數(shù)字代表看上面的文檔.
4,表示服務(wù)器返回的數(shù)據(jù)已經(jīng)完全接收,或者本次接收已經(jīng)失敗。
通信過(guò)程中,每當(dāng)實(shí)例對(duì)象發(fā)生狀態(tài)變化,它的readyState屬性的值就會(huì)改變。這個(gè)值每一次變化,都會(huì)觸發(fā)readyStateChange事件。
var xhr = new XMLHttpRequest();

if (xhr.readyState === 4) {
  // 請(qǐng)求結(jié)束,處理服務(wù)器返回的數(shù)據(jù)
} else {
  // 顯示提示“加載中……”
}

上面代碼中,xhr.readyState等于4時(shí),表明腳本發(fā)出的 HTTP 請(qǐng)求已經(jīng)成功。其他情況,都表示 HTTP 請(qǐng)求還在進(jìn)行中。

下面我們從時(shí)間角度看看這個(gè)過(guò)程

當(dāng)我們發(fā)送一個(gè)/xxx請(qǐng)求,使用的時(shí)間為9ms,9毫秒實(shí)際上很長(zhǎng),我們看一看在代碼中9毫秒可以干什么
在控制臺(tái)執(zhí)行

console.time(); 
var a=1 ;  
console.timeEnd();

返回結(jié)果為default: 0.008056640625ms,聲明一個(gè)變量只用了0.008ms

打印一句話(huà)只用了1ms

所以9ms對(duì)于瀏覽器來(lái)說(shuō),對(duì)于代碼來(lái)說(shuō)是很長(zhǎng)的,可以做很多事情.

接下來(lái)看看readyState屬性在一次請(qǐng)求中的變化過(guò)程

let request = new XMLHttpRequest();
    request.open("GET","/xxx")
    request.send();
    setInterval(()=>{//在發(fā)送請(qǐng)求的過(guò)程中,每一毫秒問(wèn)一下
        console.log(request.readyState);
    },1)

結(jié)果為:

readyState在這個(gè)過(guò)程中從1變?yōu)?
readyState各個(gè)值的含義

剛剛只顯示了1和4的原因是因?yàn)?,3太快,比一毫秒還快

01234這四個(gè)狀態(tài)是逐個(gè)經(jīng)過(guò)的
我們只需要記住4,4代表請(qǐng)求已經(jīng)把響應(yīng)下載完畢了

4.1.3 XMLHttpRequest.onreadystatechange

XMLHttpRequest.onreadystatechange = callback;

當(dāng) readyState 的值改變的時(shí)候,callback 函數(shù)會(huì)被調(diào)用。

例子:

var xhr= new XMLHttpRequest(),
    method = "GET",
    url = "https://developer.mozilla.org/";

xhr.open(method, url, true);
xhr.onreadystatechange = function () {
  if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
    console.log(xhr.responseText)
  }
}
xhr.send();

XMLHttpRequest.DONE就是4

onreadystatechange測(cè)試
把監(jiān)聽(tīng)函數(shù)往上寫(xiě),這樣就不會(huì)錯(cuò)過(guò)每一個(gè)readyState的變化

myButton.addEventListener("click",(e)=>{
    let request = new XMLHttpRequest();
    request.onreadystatechange = ()=>{//把監(jiān)聽(tīng)函數(shù)往上寫(xiě),這樣就不會(huì)錯(cuò)過(guò)每一個(gè)readyState的變化
        console.log(request.readyState);
    }
    request.open("GET","/xxx")//配置request.參數(shù)分別為方法和路徑
    request.send();//發(fā)送請(qǐng)求
    // console.log(request)
})

打印結(jié)果為1,2,3,4
4代表請(qǐng)求已經(jīng)把響應(yīng)下載完畢了,但是請(qǐng)求成功和失敗還要看status狀態(tài)碼是大于200小于300還是大于400

 request.onreadystatechange = ()=>{
        if(request.readyState ===4){
            console.log("請(qǐng)求和響應(yīng)都完畢了");
            if ( request.status>=200&&request.status<=400){
                console.log("說(shuō)明請(qǐng)求成功");
                console.log(request.responseText);//打印響應(yīng)的第四部分,字符串
            }else if(request.status>=400){
                console.log("響應(yīng)失敗");
            }
        } 
    }


但是xml結(jié)構(gòu)不方便,需要使用DOMapi去獲取數(shù)據(jù).現(xiàn)在使用json

4.1.4 使用json解析響應(yīng)的第四部分

什么是json:
json是一門(mén)數(shù)據(jù)格式化語(yǔ)言,用來(lái)表示數(shù)據(jù)
https://www.json.org/
軌道圖

js與json的區(qū)別:

以下都是合法的json語(yǔ)法:

"hi"
null
["a","b"]
{"name":"馬濤濤","isBoy":true}
下面不符合!
{"x":"y"}
必須雙引號(hào)

接下來(lái)我們返回一個(gè)符合json語(yǔ)法的字符串

else if (path === "/xxx") {
    response.statusCode = 200
    response.setHeader("Content-Type", "text/xml;charset=utf-8")
    response.write(`
    {
      "note":{
        "from":"mataotao",
        "to":"ni",
        "bool":true,
        "arr":["a",1,2,3],
        "num":3
      }
    }
    `)
    response.end()

使用window.JSON這個(gè)API,把符合json語(yǔ)法的字符串轉(zhuǎn)化為js對(duì)應(yīng)的值
這個(gè)API就像window.document.getElementById一樣,是瀏覽器提供的api
修改一下main.js將json轉(zhuǎn)化為

if ( request.status>=200&&request.status<=400){
                console.log("說(shuō)明請(qǐng)求成功");
                console.log(request.responseText);
                console.log( typeof request.responseText);//string

                let string = request.responseText;
                //把符合json語(yǔ)法的字符串轉(zhuǎn)化為js對(duì)應(yīng)的值
                let object2 = window.JSON.parse(string);
                console.log( typeof object2)
                console.log(object2)
            }

這樣我們就可以用object.note.from取到"mataotao"這個(gè)字符串

http響應(yīng)第四部分永遠(yuǎn)是字符串,知識(shí)寫(xiě)的這個(gè)字符串剛好符合json對(duì)象的語(yǔ)法

面試問(wèn)題:請(qǐng)使用原生JS發(fā)送Ajax請(qǐng)求

一般面試大概率會(huì)問(wèn)這個(gè)問(wèn)題,寫(xiě)不對(duì)一定過(guò)不了面試

下面四句代碼一定要記住:

myButton.addEventListener("click",(e)=>{
//這四句一定要記住
    let request = new XMLHttpRequest();
    request.onreadystatechange = ()=>{
    if(request.readyState === XMLHttpRequest.DONE && request.status === 200) {
    console.log(request.responseText)
  }
    }
    request.open("GET","/xxx")//配置request.參數(shù)分別為方法和路徑
    request.send();//發(fā)送請(qǐng)求
//這四句一定要記住
})

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96461.html

相關(guān)文章

  • Generator(生成器) 學(xué)習(xí)理解實(shí)踐

    摘要:總結(jié)異步編程解決方案可理解為一種狀態(tài)機(jī),封裝了多個(gè)內(nèi)部狀態(tài)可返回一個(gè)指向內(nèi)部狀態(tài)的指針對(duì)象遍歷器對(duì)象,所以可理解為其是一個(gè)遍歷器對(duì)象生成函數(shù)產(chǎn)出定義不同的內(nèi)部狀態(tài),后跟表達(dá)式。 created at 2019-04-08 總結(jié) 異步編程解決方案 可理解為一種狀態(tài)機(jī),封裝了多個(gè)內(nèi)部狀態(tài) 可返回一個(gè)指向內(nèi)部狀態(tài)的指針對(duì)象(遍歷器對(duì)象Interator),所以可理解為其是一個(gè)遍歷器對(duì)象生成...

    Travis 評(píng)論0 收藏0
  • 新手學(xué)習(xí)ajax

    摘要:對(duì)于前端新手的我來(lái)說(shuō),學(xué)習(xí)的過(guò)程有點(diǎn)痛苦。因?yàn)橹暗膶W(xué)習(xí)全是只與前端有關(guān)的像呀這些都還不涉及與后臺(tái)數(shù)據(jù)交互。然后學(xué)習(xí)看了很多書(shū)覺(jué)得還是有些懵。這意味著可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下,對(duì)網(wǎng)頁(yè)的某部分進(jìn)行更新。幫助新手理解是很不錯(cuò)的。 對(duì)于前端新手的我來(lái)說(shuō),學(xué)習(xí)ajax的過(guò)程有點(diǎn)痛苦。因?yàn)橹暗膶W(xué)習(xí)全是只與前端有關(guān)的像css、js呀這些都還不涉及與后臺(tái)數(shù)據(jù)交互。前段時(shí)間用JS做了一個(gè)20...

    idisfkj 評(píng)論0 收藏0
  • 前端相關(guān)大雜燴

    摘要:希望幫助更多的前端愛(ài)好者學(xué)習(xí)。前端開(kāi)發(fā)者指南作者科迪林黎,由前端大師傾情贊助。翻譯最佳實(shí)踐譯者張捷滬江前端開(kāi)發(fā)工程師當(dāng)你問(wèn)起有關(guān)與時(shí),老司機(jī)們首先就會(huì)告訴你其實(shí)是個(gè)沒(méi)有網(wǎng)絡(luò)請(qǐng)求功能的庫(kù)。 前端基礎(chǔ)面試題(JS部分) 前端基礎(chǔ)面試題(JS部分) 學(xué)習(xí) React.js 比你想象的要簡(jiǎn)單 原文地址:Learning React.js is easier than you think 原文作...

    fuyi501 評(píng)論0 收藏0
  • JavaScript系列(四) - 收藏集 - 掘金

    摘要:函數(shù)式編程前端掘金引言面向?qū)ο缶幊桃恢币詠?lái)都是中的主導(dǎo)范式。函數(shù)式編程是一種強(qiáng)調(diào)減少對(duì)程序外部狀態(tài)產(chǎn)生改變的方式。 JavaScript 函數(shù)式編程 - 前端 - 掘金引言 面向?qū)ο缶幊桃恢币詠?lái)都是JavaScript中的主導(dǎo)范式。JavaScript作為一門(mén)多范式編程語(yǔ)言,然而,近幾年,函數(shù)式編程越來(lái)越多得受到開(kāi)發(fā)者的青睞。函數(shù)式編程是一種強(qiáng)調(diào)減少對(duì)程序外部狀態(tài)產(chǎn)生改變的方式。因此,...

    cfanr 評(píng)論0 收藏0
  • [譯] 前端攻略-從路人甲到英雄無(wú)敵二:JavaScript 不斷演化的框架

    摘要:一般來(lái)說(shuō),聲明式編程關(guān)注于發(fā)生了啥,而命令式則同時(shí)關(guān)注與咋發(fā)生的。聲明式編程可以較好地解決這個(gè)問(wèn)題,剛才提到的比較麻煩的元素選擇這個(gè)動(dòng)作可以交托給框架或者庫(kù)區(qū)處理,這樣就能讓開(kāi)發(fā)者專(zhuān)注于發(fā)生了啥,這里推薦一波與。 本文翻譯自FreeCodeCamp的from-zero-to-front-end-hero-part。 繼續(xù)譯者的廢話(huà),這篇文章是前端攻略-從路人甲到英雄無(wú)敵的下半部分,在...

    roadtogeek 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<