成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

thursday / 1644人閱讀

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

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

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

JS 是一門語言,JSON 是另一門語言,JSON 這門語言抄襲了 JS這門語言

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

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

1 如何發(fā)請求?

用 form 可以發(fā)請求,但是會刷新頁面或新開頁面
用 a 可以發(fā) get 請求,但是也會刷新頁面或新開頁面
用 img 可以發(fā) get 請求,但是只能以圖片的形式展示
用 link 可以發(fā) get 請求,但是只能以 CSS、favicon 的形式展示
用 script 可以發(fā) get 請求,但是只能以腳本的形式運行

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

password=123456就是POST請求的第四部分

那有沒有什么方式可以實現(xiàn)

get、post、put、delete 請求都行

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

2 微軟的突破

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

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

3 AJAX

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

使用 XMLHttpRequest 發(fā)請求

服務(wù)器返回 XML 格式的字符串(因為當(dāng)時XML在當(dāng)時是流行的數(shù)據(jù)傳輸格式,后來用json)

JS 解析 XML,并更新局部頁面

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

.

具體來說,AJAX 包括以下幾個步驟。

創(chuàng)建 XMLHttpRequest 實例

發(fā)出 HTTP 請求

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

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

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

4 如何使用 XMLHttpRequest對象

所有代碼都在這里
每一次大的更新可以查看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()
  }

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

http請求的路徑都是絕對路徑.所以都是以/開頭

4.1開始使用

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

我們請求一個以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ā)送請求
})

index.html


    
    

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

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

4.1.2 理解j代碼中的時間概念

XMLHttpRequest.readyState

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

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

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

下面我們從時間角度看看這個過程

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

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

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

打印一句話只用了1ms

所以9ms對于瀏覽器來說,對于代碼來說是很長的,可以做很多事情.

接下來看看readyState屬性在一次請求中的變化過程

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

結(jié)果為:

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

剛剛只顯示了1和4的原因是因為2,3太快,比一毫秒還快

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

4.1.3 XMLHttpRequest.onreadystatechange

XMLHttpRequest.onreadystatechange = callback;

當(dāng) readyState 的值改變的時候,callback 函數(shù)會被調(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測試
把監(jiān)聽函數(shù)往上寫,這樣就不會錯過每一個readyState的變化

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

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

 request.onreadystatechange = ()=>{
        if(request.readyState ===4){
            console.log("請求和響應(yīng)都完畢了");
            if ( request.status>=200&&request.status<=400){
                console.log("說明請求成功");
                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是一門數(shù)據(jù)格式化語言,用來表示數(shù)據(jù)
https://www.json.org/
軌道圖

js與json的區(qū)別:

以下都是合法的json語法:

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

接下來我們返回一個符合json語法的字符串

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這個API,把符合json語法的字符串轉(zhuǎn)化為js對應(yīng)的值
這個API就像window.document.getElementById一樣,是瀏覽器提供的api
修改一下main.js將json轉(zhuǎn)化為

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

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

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

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

面試問題:請使用原生JS發(fā)送Ajax請求

一般面試大概率會問這個問題,寫不對一定過不了面試

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

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ā)送請求
//這四句一定要記住
})

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/96461.html

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

    roadtogeek 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<