Foundation of Ajax

前言

每一個人在學(xué)習(xí)JavaScript中都會有一道坎,那便是今天的主題:Ajax驹溃。
一年前含鳞,我真的時候我才接觸了這個東西影锈,但是覺得真的蠻難的,不是很理解這其中的原理蝉绷。
直到今年我才有寫過涉及Ajax的代碼

知其所以然

首先鸭廷,先解釋一下,為什么出現(xiàn)AJAX熔吗?很久很久以前辆床,在表單驗證的過程中,都必須按下提交按鈕
才能將數(shù)據(jù)進(jìn)行后臺驗證桅狠,所以造成的一個結(jié)果就是:萬一這個用戶名是注冊過的讼载,頁面會自動刷新
轿秧,所有信息都要重新填寫一遍;所以為了防止不斷的刷新咨堤、驗證菇篡,拿起鍵盤砸電腦的行為。Ajax出現(xiàn)了吱型。
AjaxAsynchronous JavaScript and XML縮寫逸贾。這一技術(shù)能向服務(wù)器請求數(shù)據(jù)而無需刷新頁面,當(dāng)然
會帶來良好的用戶體驗津滞。

Ajax的核心是JavaScript中的一個對象XMLHttpRequest,該對象幫我們將數(shù)據(jù)發(fā)往服務(wù)器和解析服務(wù)器響應(yīng)。
當(dāng)然灼伤,這個對象有一定的兼容問題触徐,只要是IE7+才能使用我以下的原生方法,現(xiàn)在你也不用考慮這么多了狐赡,你可以使用jQuery
封裝好的ajax方法撞鹉。

以下是原生方法:

var XHR = new XMLHttpRequest();

都說了,其核心就是這個對象颖侄。想將數(shù)據(jù)發(fā)往后臺處理鸟雏,我們就要創(chuàng)建一個XMLHttpRequest幫助我們造一條能通完后臺的路。
這個對象上有許多屬性和方法览祖,主要用到兩個方法孝鹊。

open方法

open(method,url,async)
  • methd 請求所用的HTTP方法。如果不能理解展蒂,就想想表單提交當(dāng)中是不是也有同樣的屬性又活,是一樣。
  • url 該請求所要訪問的URL锰悼。就是要將數(shù)據(jù)提交到的目的地柳骄。
  • async 這是一個布爾參數(shù)。true(異步)false(同步)箕般。當(dāng)然你要使用Ajax時這里一定要true耐薯。

send方法

send(string)
  • 將請求提交到服務(wù)器
  • string 僅用于POST請求

你要使用該對象實現(xiàn)同步的方法也是可以的。

// HTML  代碼
// <div id="test"></div>
XHR.opend("get","ajax_test.php",false);
XHR.send();  // 執(zhí)行到這里的時候丝里,整個頁面卡住等待服務(wù)器的響應(yīng)
doucument.getElementById("test").innerHTML = XHR.responseText
// PHP代碼
// echo "我是服務(wù)器返回的文字"

onreadystatechange 事件

我們整個Ajax要做就是:將數(shù)據(jù)發(fā)送到服務(wù)器曲初,服務(wù)器在響應(yīng)回來響應(yīng)的數(shù)據(jù)進(jìn)行處理。
然而丙者,我們怎么樣才能得到監(jiān)聽響應(yīng)呢复斥?
因為XMLHttpRequest狀態(tài)都由readyState記錄著,每一次改變都會觸發(fā)onreadystatechange械媒。

XHR.onreadystatechange = function(){
     if(XHR.readyState == 4 && XHR.status == 200){
        doucument.getElementById("test").innerHTML = XHR.responseText
     }
}

補(bǔ):還記得當(dāng)初上過的計算機(jī)網(wǎng)絡(luò)嗎目锭?TCP連接是經(jīng)歷了三次握手建立起來的评汰。每一次
的握手,在報文里有一部分字段信息來說明當(dāng)前連接情況痢虹。同理被去,XMLHttpRequestreadyState
屬性記錄著其的狀態(tài)。而readyState的每一次的改變奖唯,都會觸發(fā)onreadystatechange
事件惨缆。

XMLHttpRequest三個重要屬性(補(bǔ))

  1. onreadystatechange:事件(存儲函數(shù)),每當(dāng)readyState屬性改變時丰捷,就會調(diào)用該函數(shù)坯墨。
  2. readyState:XMLHttpRequest的狀態(tài)。從0到4發(fā)生變化病往。
  • 0:請求未初始化
  • 1:服務(wù)器鏈接已建立
  • 2:請求已接收
  • 3:請求處理中
  • 4:請求已完成(響應(yīng)就緒)
  1. status:響應(yīng)狀態(tài)碼
  • 200 : "OK"
  • 404 : "not found"

總結(jié)

使用Ajax就是在頁面刷新的狀態(tài)下捣染,與服務(wù)器進(jìn)行數(shù)據(jù)的交流。

// 原生
    var XHR = new XMLHttpRequest();
    XHR.onreadystatechange = function(){
        if(XHR.readyState == 4 && XHR.status == 4){
            doucument.getElementById("test").innerHTML = XHR.responseText
        }
    }
    // GET
    XHR.open("GET","ajax_test.php?name=baiji",true)
    XHR.send()
    
    // POST
    XHR.open("POST","ajax_test.php",true)
    XHR.setRequestHeader("Content-Type","application/xxx-form-urlencoded")
    XHR.send(name=baiji)

當(dāng)然你也可自己封裝ajax函數(shù)或者使用jQueryajax

/*
    先定義調(diào)用方式
    ajax({
      url:"getData.php",
      type:"get",
      data:{
        name:"baiji"
      },
      success:fn,
      error:fn
    })
*/

    function ajax(opts){
        var XHR =new XMLHttpRequest();
        
        XHR.onreadystatechange = function(){
            if(XHR.readyState == 4){
                if(XHR.status == 200){
                    opts.success(XHR.responseText)
                }else{
                    opts.error();
                }
            }
        }
        
        var dataStr = "";
        
        for(var key in opts.data){
            dataStr += key+"="+opts.data[key]+"&";
        }
        
        dataStr = dataStr.substring(0,dataStr.length-1);
        var type = opts.type.toLowerCase();
        
        if(type === "get"){
            XHR.open(type,opts.url+"?"+dataStr,true);
            XHR.send();
        }
        
        if(type === "post"){
            XHR.open(type,opts.url,true);
            XHR.setRequestHeader("Content-Type":"application/xxx-form-urlencoded");
            XHR.send(dataStr);
        }
        
    }

當(dāng)然你可以選擇最簡單的方便的jQuery停巷,更多用法請自行查看API耍攘。

    $.ajax({
        type:"GET",
        url:"getData.php"
    })

上述都是我自己理解的Ajax畔勤,因為一直沒有很好的狀態(tài)去做項目或者也沒有什么好的項目讓自己用點心去做蕾各。期望自己調(diào)整好狀態(tài)吧,我現(xiàn)在回頭看看才發(fā)現(xiàn)寫完這篇博客庆揪,一天的書有沒有看啦J角!嚷硫!


本文章著作權(quán)歸白小霽所有检访,轉(zhuǎn)載須說明來源

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市仔掸,隨后出現(xiàn)的幾起案子脆贵,更是在濱河造成了極大的恐慌,老刑警劉巖起暮,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卖氨,死亡現(xiàn)場離奇詭異,居然都是意外死亡负懦,警方通過查閱死者的電腦和手機(jī)筒捺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纸厉,“玉大人系吭,你說我怎么就攤上這事】牌罚” “怎么了肯尺?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵沃缘,是天一觀的道長。 經(jīng)常有香客問我则吟,道長槐臀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任氓仲,我火速辦了婚禮水慨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘敬扛。我一直安慰自己晰洒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布舔哪。 她就那樣靜靜地躺著欢顷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捉蚤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天炼七,我揣著相機(jī)與錄音缆巧,去河邊找鬼。 笑死豌拙,一個胖子當(dāng)著我的面吹牛陕悬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播按傅,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼捉超,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了唯绍?” 一聲冷哼從身側(cè)響起拼岳,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎况芒,沒想到半個月后惜纸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绝骚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年耐版,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片压汪。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡粪牲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出止剖,到底是詐尸還是另有隱情腺阳,我是刑警寧澤落君,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站舌狗,受9級特大地震影響叽奥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痛侍,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一朝氓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧主届,春花似錦赵哲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绘闷,卻和暖如春橡庞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背印蔗。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工扒最, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人华嘹。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓吧趣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親耙厚。 傳聞我的和親對象是個殘疾皇子强挫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,585評論 2 359

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