成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

手把手教你實現一個前端Jquery的Ajax,從此讓它成為面試的送分題

開發 前端
這篇文章主要聊一聊如何手寫一個jquery的ajax方法,這是前端中的基礎知識,也是一道非常經典的前端面試題!

前言

這篇文章主要聊一聊如何手寫一個jquery的ajax方法,這是前端中的基礎知識,也是一道非常經典的前端面試題!

一步步手寫ajax

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

手把手教你實現一個前端jquery的ajax,從此讓它成為面試的送分題

圖1

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

  1. var $ = {}; // 模擬jquery對象 
  2. $.ajax = function(options){ 
  3.     // 實現邏輯 

接下來我們就開始寫函數里面的邏輯。

手把手教你實現一個前端jquery的ajax,從此讓它成為面試的送分題

圖2

如圖2,ajax的關鍵在于XMLHttpRequest對象,它提供了對http協議的安全訪問接口,這里使用了它的兩個方法和一個事件:

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

2)send方法只有一個參數,表示向服務器發送的參數,一般是對象;

3)onreadystatechange是一個事件,它可以監聽從請求開始到結束整個過程的狀態,狀態保存在xhr的readyState屬性中。

readyState狀態:

  • 0代表未初始化,open方法還未執行;
  • 1代表正在加載,open已被執行但send還未被執行;
  • 2代表已經加載完畢,send已被執行,請求已被發送;
  • 3代表正在等待服務器響應;
  • 4代表響應已經完成。

從上面readyState狀態我們可以看出,ajax只需要4的情況,其他狀態其實都是失敗!

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

好了,經過上面的分析,我們繼續完善onreadystatechange事件的處理函數:

手把手教你實現一個前端jquery的ajax,從此讓它成為面試的送分題

圖3

如圖3,在事件處理函數中我們寫了兩個方法ajaxSuccess和ajaxError,它們分別執行ajax參數對象傳入的success和error這兩個函數屬性。我們知道ajax對象參數中還一個屬性叫complete,這是一個方法,無論請求成功與否,它都會被執行,所以它在ajaxSuccess和ajaxError中都需要被調用執行一次。xhr.responseText代表服務器返回的數據,xhr.statusText代表狀態碼對應的狀態信息。

接下來我們還需要設置請求頭,可以用xhr.setRequestHeader來完成,如下:

手把手教你實現一個前端jquery的ajax,從此讓它成為面試的送分題

圖4

圖4中,我們對兩個比較特殊的請求頭做了默認設置(Accept和Content-type),其中當我們用post類型向服務器發送請求并且帶有參數,此時content-type需要設置為application/x-www-form-urlencoded,其他的請求頭可以通過ajax的對象參數headers屬性傳入。注意setRequestHeader方法需要在open方法之后調用!

在有些場景下,我們需要在發送請求前做一些邏輯判斷,如果不滿足條件我們需要阻止請求的發送,為了滿足需求,我們需要在ajax調用open方法之前添加一個鉤子!

手把手教你實現一個前端jquery的ajax,從此讓它成為面試的送分題

圖5

圖5中我們通過beforeSend函數的執行結果判斷是否需要取消請求!

寫到這里其實還有一步沒做,那就超時邏輯,比如在網絡不好的情況下,我們不能讓頁面一直處于loading狀態,需要設置一個超時時間,超過這個時間就代表ajax請求失敗!開發超時的需求,我們最容易想到的是利用定時器setTimeout,現在我們補上!

手把手教你實現一個前端jquery的ajax,從此讓它成為面試的送分題

圖6

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

寫到這里,一個簡單的ajax就已經開發完了,現在直接把demo拿去使用也是沒有問題的!

常見面試題

1、手寫一個ajax?

如果你看到這里我想應該沒什么問題了!

2、如果請求發生了重定向,ajax會怎么處理?

當然是進入了error函數中!

3、如果請求發生了超時,ajax會怎么處理?

當然也是進入了error函數中!

總結

本篇文章手寫的ajax可以直接用于移動端,未考慮PC端兼容性!根據我的經驗,只要能手寫出ajax,面試中遇到相關問題就不會被難住,此類問題其實就是送分題!另外多說一點,開發PC頁面時我們使用的是jquery,而開發移動端時我們應該使用zepto.js!本篇文章就寫到這里,下一篇接著寫JSONP的實現! 

責任編輯:龐桂玉 來源: 今日頭條
相關推薦

2022-09-22 12:38:46

antd form組件代碼

2022-06-28 15:29:56

Python編程語言計時器

2021-11-10 11:40:42

數據加解密算法

2023-04-26 12:46:43

DockerSpringKubernetes

2021-06-22 10:43:03

Webpack loader plugin

2011-04-28 15:09:15

jQueryjqPlot

2021-07-13 10:17:25

GitHubLinux代碼

2020-12-15 08:58:07

Vue編輯器vue-cli

2018-11-22 09:17:21

消息推送系統

2019-08-26 09:25:23

RedisJavaLinux

2021-08-31 10:02:10

KubernetesLinux集群

2016-05-12 11:54:39

2020-12-02 12:29:24

Vue無限級聯樹形

2021-09-26 16:08:23

CC++clang_forma

2021-07-14 09:00:00

JavaFX開發應用

2011-01-06 10:39:25

.NET程序打包

2009-11-09 14:57:37

WCF上傳文件

2021-09-09 16:32:41

Java泛型框架

2023-11-28 07:36:41

Shell腳本部署

2022-08-26 08:01:38

DashWebJavaScrip
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色免费在线视频 | 在线看av网址 | 热久久久 | 日本一区不卡 | 欧美精品久久久久 | 中文字幕一区二区三区不卡在线 | 日本精品视频 | 亚洲一级淫片 | 麻豆av在线免费观看 | av网站免费看| 天天天天操 | 欧美精品一区二区三区在线播放 | 欧美精品在欧美一区二区少妇 | 欧美在线视频观看 | 成人午夜网 | 可以免费观看的av片 | 成人h电影在线观看 | 国产欧美一区二区三区日本久久久 | 久草精品视频 | av日韩在线播放 | 国产一区不卡 | 成人免费看电影 | 91精品国产91综合久久蜜臀 | 欧美日韩精品在线一区 | 欧美在线视频不卡 | 日日干夜夜操 | 成人亚洲性情网站www在线观看 | 久久午夜精品福利一区二区 | 欧美成人在线免费 | 九九热在线免费视频 | 亚洲91视频| 黄色大片免费观看 | 成人免费视频网站在线看 | 色桃网 | 美女天天操 | 91新视频| www精品美女久久久tv | 日韩一区二区在线视频 | 91色在线| 韩国精品一区二区三区 | 在线小视频 |