自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

手把手教你實(shí)現(xiàn)一個(gè)前端Jquery的Ajax,從此讓它成為面試的送分題

開(kāi)發(fā) 前端
這篇文章主要聊一聊如何手寫(xiě)一個(gè)jquery的ajax方法,這是前端中的基礎(chǔ)知識(shí),也是一道非常經(jīng)典的前端面試題!

前言

這篇文章主要聊一聊如何手寫(xiě)一個(gè)jquery的ajax方法,這是前端中的基礎(chǔ)知識(shí),也是一道非常經(jīng)典的前端面試題!

一步步手寫(xiě)ajax

在web頁(yè)面中與后端通信的順序一般都是客戶端向服務(wù)器發(fā)起請(qǐng)求,然后服務(wù)器再回復(fù)客戶端,用于通信的工具就是ajax。如果你喜歡足球,你肯定知道荷甲聯(lián)賽中也有一支豪門足球俱樂(lè)部叫阿賈克斯,名字一毛一樣。ajax就像電話一樣,將頁(yè)面和服務(wù)器聯(lián)系在一起,基本用法如下:

手把手教你實(shí)現(xiàn)一個(gè)前端jquery的ajax,從此讓它成為面試的送分題

圖1

從圖1中我們可以看出$.ajax是一個(gè)函數(shù),它的參數(shù)是一個(gè)對(duì)象,那么我們可以像如下這樣定義:

  1. var $ = {}; // 模擬jquery對(duì)象 
  2. $.ajax = function(options){ 
  3.     // 實(shí)現(xiàn)邏輯 

接下來(lái)我們就開(kāi)始寫(xiě)函數(shù)里面的邏輯。

手把手教你實(shí)現(xiàn)一個(gè)前端jquery的ajax,從此讓它成為面試的送分題

圖2

如圖2,ajax的關(guān)鍵在于XMLHttpRequest對(duì)象,它提供了對(duì)http協(xié)議的安全訪問(wèn)接口,這里使用了它的兩個(gè)方法和一個(gè)事件:

1)open方法的第一個(gè)參數(shù)是請(qǐng)求類型:get、post、head等,第二個(gè)參數(shù)是請(qǐng)求的接口地址,第三個(gè)參數(shù)表示ajax請(qǐng)求是異步(true)還是同步(false),如果是異步,在ajax發(fā)送完請(qǐng)求后js會(huì)繼續(xù)執(zhí)行,不會(huì)等待服務(wù)器響應(yīng),我們一般選擇異步,提高頁(yè)面的渲染效率;

2)send方法只有一個(gè)參數(shù),表示向服務(wù)器發(fā)送的參數(shù),一般是對(duì)象;

3)onreadystatechange是一個(gè)事件,它可以監(jiān)聽(tīng)從請(qǐng)求開(kāi)始到結(jié)束整個(gè)過(guò)程的狀態(tài),狀態(tài)保存在xhr的readyState屬性中。

readyState狀態(tài):

  • 0代表未初始化,open方法還未執(zhí)行;
  • 1代表正在加載,open已被執(zhí)行但send還未被執(zhí)行;
  • 2代表已經(jīng)加載完畢,send已被執(zhí)行,請(qǐng)求已被發(fā)送;
  • 3代表正在等待服務(wù)器響應(yīng);
  • 4代表響應(yīng)已經(jīng)完成。

從上面readyState狀態(tài)我們可以看出,ajax只需要4的情況,其他狀態(tài)其實(shí)都是失??!

另外,xhr的status屬性代表服務(wù)器返回的狀態(tài)碼,根據(jù)我們的經(jīng)驗(yàn),狀態(tài)碼在400以上都是有問(wèn)題的,要么是服務(wù)端問(wèn)題,要么就是客戶端問(wèn)題!300到400之間好像都和重定向有關(guān)系,但是有一個(gè)除外——304,如果你了解瀏覽器緩存,你肯定知道它和協(xié)商緩存有關(guān)系,其實(shí)它代表請(qǐng)求成功!另外200以下的狀態(tài)都需要請(qǐng)求者繼續(xù)操作,也不符合要求!總結(jié)一下,可用的狀態(tài)碼就是200到300之間,加一個(gè)304!

好了,經(jīng)過(guò)上面的分析,我們繼續(xù)完善onreadystatechange事件的處理函數(shù):

手把手教你實(shí)現(xiàn)一個(gè)前端jquery的ajax,從此讓它成為面試的送分題

圖3

如圖3,在事件處理函數(shù)中我們寫(xiě)了兩個(gè)方法ajaxSuccess和ajaxError,它們分別執(zhí)行ajax參數(shù)對(duì)象傳入的success和error這兩個(gè)函數(shù)屬性。我們知道ajax對(duì)象參數(shù)中還一個(gè)屬性叫complete,這是一個(gè)方法,無(wú)論請(qǐng)求成功與否,它都會(huì)被執(zhí)行,所以它在ajaxSuccess和ajaxError中都需要被調(diào)用執(zhí)行一次。xhr.responseText代表服務(wù)器返回的數(shù)據(jù),xhr.statusText代表狀態(tài)碼對(duì)應(yīng)的狀態(tài)信息。

接下來(lái)我們還需要設(shè)置請(qǐng)求頭,可以用xhr.setRequestHeader來(lái)完成,如下:

手把手教你實(shí)現(xiàn)一個(gè)前端jquery的ajax,從此讓它成為面試的送分題

圖4

圖4中,我們對(duì)兩個(gè)比較特殊的請(qǐng)求頭做了默認(rèn)設(shè)置(Accept和Content-type),其中當(dāng)我們用post類型向服務(wù)器發(fā)送請(qǐng)求并且?guī)в袇?shù),此時(shí)content-type需要設(shè)置為application/x-www-form-urlencoded,其他的請(qǐng)求頭可以通過(guò)ajax的對(duì)象參數(shù)headers屬性傳入。注意setRequestHeader方法需要在open方法之后調(diào)用!

在有些場(chǎng)景下,我們需要在發(fā)送請(qǐng)求前做一些邏輯判斷,如果不滿足條件我們需要阻止請(qǐng)求的發(fā)送,為了滿足需求,我們需要在ajax調(diào)用open方法之前添加一個(gè)鉤子!

手把手教你實(shí)現(xiàn)一個(gè)前端jquery的ajax,從此讓它成為面試的送分題

圖5

圖5中我們通過(guò)beforeSend函數(shù)的執(zhí)行結(jié)果判斷是否需要取消請(qǐng)求!

寫(xiě)到這里其實(shí)還有一步?jīng)]做,那就超時(shí)邏輯,比如在網(wǎng)絡(luò)不好的情況下,我們不能讓頁(yè)面一直處于loading狀態(tài),需要設(shè)置一個(gè)超時(shí)時(shí)間,超過(guò)這個(gè)時(shí)間就代表ajax請(qǐng)求失?。¢_(kāi)發(fā)超時(shí)的需求,我們最容易想到的是利用定時(shí)器setTimeout,現(xiàn)在我們補(bǔ)上!

手把手教你實(shí)現(xiàn)一個(gè)前端jquery的ajax,從此讓它成為面試的送分題

圖6

如圖6,在超時(shí)的情況下,我們將onreadystatechange事件處理函數(shù)置為一個(gè)空函數(shù)并且放棄這次請(qǐng)求,然后執(zhí)行error函數(shù),另外在正常的onreadystatechange事件處理邏輯中我們需要及時(shí)清除這個(gè)定時(shí)器!

寫(xiě)到這里,一個(gè)簡(jiǎn)單的ajax就已經(jīng)開(kāi)發(fā)完了,現(xiàn)在直接把demo拿去使用也是沒(méi)有問(wèn)題的!

常見(jiàn)面試題

1、手寫(xiě)一個(gè)ajax?

如果你看到這里我想應(yīng)該沒(méi)什么問(wèn)題了!

2、如果請(qǐng)求發(fā)生了重定向,ajax會(huì)怎么處理?

當(dāng)然是進(jìn)入了error函數(shù)中!

3、如果請(qǐng)求發(fā)生了超時(shí),ajax會(huì)怎么處理?

當(dāng)然也是進(jìn)入了error函數(shù)中!

總結(jié)

本篇文章手寫(xiě)的ajax可以直接用于移動(dòng)端,未考慮PC端兼容性!根據(jù)我的經(jīng)驗(yàn),只要能手寫(xiě)出ajax,面試中遇到相關(guān)問(wèn)題就不會(huì)被難住,此類問(wèn)題其實(shí)就是送分題!另外多說(shuō)一點(diǎn),開(kāi)發(fā)PC頁(yè)面時(shí)我們使用的是jquery,而開(kāi)發(fā)移動(dòng)端時(shí)我們應(yīng)該使用zepto.js!本篇文章就寫(xiě)到這里,下一篇接著寫(xiě)JSONP的實(shí)現(xiàn)! 

責(zé)任編輯:龐桂玉 來(lái)源: 今日頭條
相關(guān)推薦

2022-09-22 12:38:46

antd form組件代碼

2022-06-28 15:29:56

Python編程語(yǔ)言計(jì)時(shí)器

2021-11-10 11:40:42

數(shù)據(jù)加解密算法

2021-06-22 10:43:03

Webpack loader plugin

2011-04-28 15:09:15

jQueryjqPlot

2023-04-26 12:46:43

DockerSpringKubernetes

2020-12-15 08:58:07

Vue編輯器vue-cli

2019-08-26 09:25:23

RedisJavaLinux

2018-11-22 09:17:21

消息推送系統(tǒng)

2021-07-13 10:17:25

GitHubLinux代碼

2021-08-31 10:02:10

KubernetesLinux集群

2020-12-02 12:29:24

Vue無(wú)限級(jí)聯(lián)樹(shù)形

2016-05-12 11:54:39

2009-11-09 14:57:37

WCF上傳文件

2011-01-06 10:39:25

.NET程序打包

2021-09-09 16:32:41

Java泛型框架

2023-11-28 07:36:41

Shell腳本部署

2022-08-26 08:01:38

DashWebJavaScrip

2016-11-01 09:46:04

2021-09-26 16:08:23

CC++clang_forma
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)