原生js學習筆記8——Ajax基礎(chǔ)

什么是Ajax

不刷新頁面的情況下從服務器獲取泊愧、提交數(shù)據(jù)的一種數(shù)據(jù)交互方式童谒。

Ajax使用步驟

1\創(chuàng)建Ajax對象

var httpRequest = new XMLHttpRequset可以創(chuàng)建一個Ajax請求對象。

注意:瀏覽器的兼容問題

IE6以及之前的IE不支持上邊的創(chuàng)建愛你方法达吞,這些版本的瀏覽器并沒有集成Ajax铁坎,而是當做一個插件來處理,所以在創(chuàng)建時需要做兼容性處理:

if (window.XMLHttpRequest) {
    xmlHttp = new XMLHttpRequest;   
} else{
    // IE5\6使用的是ActiveXObject對象
    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}

2\配置Ajax的請求地址

使用Ajax的open方法來配置地址

open方法的三個參數(shù):

  1. 數(shù)據(jù)提交方式
  2. 地址
  3. 是否異步請求

示例xmlHttp.open ("GET", “http://127.0.0.1/index.php”, "true")

數(shù)據(jù)的提交方式分為GET和POST兩種方式

**GET: **

1. 把提交的數(shù)據(jù)的名稱、對應的值使用“?”拼接在url之后,如果有多個數(shù)據(jù)场绿,則使用“&”連接
2. 參數(shù)的長度有限制剖效,不能太長(由于各個瀏覽器對長度要求不一樣,所以不詳細說)焰盗,否則會被截取
3. 只能傳遞字符串類型的參數(shù)璧尸。

POST:

1. 把提交的數(shù)據(jù)封裝在http頭字段中。
2. 參數(shù)長度可以在服務器端調(diào)整熬拒,因此理論上任意長度的參數(shù)都可以傳遞爷光。
3. 可以傳遞任意類型的數(shù)據(jù)

異步與同步:

異步(true):不會阻塞代碼,ajax的工作未完成澎粟,繼續(xù)執(zhí)行后邊的代碼

同步(false):阻塞代碼蛀序,ajax的工作未完成,則等待ajax完成后在執(zhí)行后邊代碼當后續(xù)的代碼需要用到前邊的請求數(shù)據(jù)時活烙,需要用同步徐裸,否則用異步請求。

3\發(fā)送請求

xmlHttp對象的send方法發(fā)送上邊的請求: 示例xmlHttp.send()啸盏。

4\接收服務器返回的數(shù)據(jù)

responseText:ajax請求返回的內(nèi)容被存放在這個屬性里
readyState:ajax的工作狀態(tài)
on readystate change:當readyState發(fā)生改變時重贺,會觸發(fā)
status:該屬性代表服務器的工作狀態(tài)(也就是http狀態(tài)碼):200表示請求成功

readyState返回碼含義

存有 XMLHttpRequest 的狀態(tài)。從 0 到 4 發(fā)生變化回懦。

0: 請求未初始化

1: 服務器連接已建立

2: 請求已接收

3: 請求處理中

4: 請求已完成气笙,且響應已就緒

示例1:使用Ajax請求服務器中的一個新網(wǎng)頁資源

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript">
        
        function localXMLDoc () {
            var xmlHttp;
            // 1. 創(chuàng)建XMLHttpRequest對象
            if (window.XMLHttpRequest) {
                xmlHttp = new XMLHttpRequest;   
            } else{
                 // IE5\6使用的是ActiveXObject對象
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            
            // 2. 每次readyState改變時,都會觸發(fā):onreadystatechange事件
            xmlHttp.onreadystatechange = function () {
        // readyState返回碼含義
//存有 XMLHttpRequest 的狀態(tài)怯晕。從 0 到 4 發(fā)生變化潜圃。
//0: 請求未初始化
//1: 服務器連接已建立
//2: 請求已接收
//3: 請求處理中
//4: 請求已完成,且響應已就緒
                if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                    alert(xmlHttp.responseText);
                    document.getElementById('div').innerHTML = xmlHttp.responseText;
                } else{
//                  alert('請求不成功舟茶,狀態(tài)'+xmlHttp.status);
                }
            }
            
            // 3. 創(chuàng)建請求事件
            xmlHttp.open("GET", "http://127.0.0.1/js.html",true);
            // 4. 發(fā)送請求
            xmlHttp.send();
        }
        
        
        
                    
            
    </script>
    </head>
    <body>
        <button onclick="localXMLDoc()">點擊加載</button>
        
        <div id = 'div'></div>
    </body>
</html>

示例2:使用Ajax請求一個帶參數(shù)的URL

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            #search ,#hidden{
                display: inline-block;
                width: 200px;
                border: 1px solid black;
            }
            
        </style>
        
        <script type="text/javascript">
            function shoeHint(str) {
                var xmlHttp;
                // 如果傳入的字符串小于0則直接返回秉犹,并清空輸入框
                if (str.length == 0) {
                    document.getElementById('search').innerHTML = "";
                    return ;
                }
                
                // 創(chuàng)建XMLHttpRequest對象
                if (window.XMLHttpRequest) {
                    xmlHttp = new XMLHttpRequest();
                } else {
                    xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
                }
                xmlHttp.onreadystatechange=function() {
                    // 根據(jù)返回碼判斷請求是否成功
                if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                    document.getElementById('hidden').innerHTML = xmlHttp.responseText;
                }
                }
                
                
                // 配置請求地址
                xmlHttp.open("GET", "https://127.0.0.1/hello.php?q="+str,true);
                //開始請求
                xmlHttp.send();
            }
            
            document.crea
        </script>
    </head>
    <body>
        <input type="text" name="search" id="search" value="" placeholder="" onkeyup="shoeHint(this.value)"/>
        <br /><div id = "hidden" >
            
        </div>
    </body>
</html>

綜合示例:使用Ajax加載新聞標題:
前端代碼

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        
        <script type="text/javascript">
            function getNews () {
                var httpRequest = null;
                httpRequest = new XMLHttpRequest();
                
                httpRequest.open("GET", "news.php/",true);
                httpRequest.send();
                httpRequest.onreadystatechange = function () {
                    
                    if (httpRequest.status == 200 && httpRequest.readyState == 4) {
    //                      alert(httpRequest.responseText);
                        // 將JSON數(shù)據(jù)轉(zhuǎn)換為普通數(shù)據(jù)
                             var r = JSON.parse(httpRequest.responseText);
                             //                          console.log(r[0].title);
                        var hml = '';
                        
                        for (var i = 0; i < r.length; i++) {
                            // 拼接無序列表
                            hml += "<li>"+"<a href='#'>" +r[i].title+"</a>"+"</li>";
                        }
                        document.getElementById('newsUl').innerHTML = hml;
                    }
                }
            }
        </script>
        
    </head>
    <body>
        
        <button id = "get" onclick="getNews()">獲取新聞</button>
        
        <ul id = "newsUl">
            
        </ul>
    </body>
</html>

服務端代碼

<?php 
    
    
    $news = array(
        
        array('title' => '樓繼偉財長:簡單提高個稅起征點不公平'),
        array('title' => '[銀行]回應國有銀行經(jīng)營持續(xù)惡化:不良貸款率的確在溫和上升 今后還會上漲'),
        array('title' => '[改革]稱財稅改革進度低于預期 營增改今年完成 難點在于納稅人多比較復雜'),
        array('title' => '[債務]回應地方債增速加大:赤字率可適當提高 稱借錢可買房 不能用于吃飯'),
        array('title' => '[相關(guān)]個人綜合稅方案已經(jīng)提交 談"勞動合同法保護企業(yè)不足":財政部不修法'),

    );
    
    echo json_encode($news);
    
    
    
?>

GET請求注意問題!稚晚!

  1. Ajax的緩存問題:如果反復請求同一個URL崇堵,則第二次請求的內(nèi)容是從瀏覽器緩存中拿到的,并不是真正服務器端的內(nèi)容客燕,所以為了避免服務器內(nèi)容更改鸳劳,但是客戶端從緩存中取數(shù)據(jù),拿不到新數(shù)據(jù)也搓,我們可以在get請求中的參數(shù)末端添加一個隨機數(shù)赏廓、或時間戳作為參數(shù):'http://127.0.0.1?username=zhangsan&password=12345&'+ new Date()

  2. Ajax的亂碼問題:如果請求參數(shù)中有中文涵紊,則會因為編碼不統(tǒng)一導致后臺認不出中文參數(shù)的情況,所以我們需要把中文參數(shù)進行編碼:'http://127.0.0.1?username='+encodeURI('全政')+'&password=123456&'+ new Date()

POST請求注意問題aC摸柄!

  1. POST請求的參數(shù)不是拼接在url之后,而是放在send()方法里:send('username=zhangsan&password=12345&'+ new Date()')
  1. 請求編碼問題:form表單提交時既忆,默認的編碼是:enctype="application/x-www-form-urlencoded" 而Ajax請求需要手動設(shè)置編碼方式驱负,在setRequestHeader('content-type', 'pplication/x-www-form-urlencoded')設(shè)置。

form提交數(shù)據(jù)示例:

<form action="" method="post" enctype="application/x-www-form-urlencoded">
            
        <input type="submit" value=""/>
</form>
        
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末患雇,一起剝皮案震驚了整個濱河市跃脊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌苛吱,老刑警劉巖酪术,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異翠储,居然都是意外死亡绘雁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門援所,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咧七,“玉大人,你說我怎么就攤上這事任斋〖套瑁” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵废酷,是天一觀的道長瘟檩。 經(jīng)常有香客問我,道長澈蟆,這世上最難降的妖魔是什么墨辛? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮趴俘,結(jié)果婚禮上睹簇,老公的妹妹穿的比我還像新娘。我一直安慰自己寥闪,他們只是感情好太惠,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疲憋,像睡著了一般凿渊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天埃脏,我揣著相機與錄音搪锣,去河邊找鬼。 笑死彩掐,一個胖子當著我的面吹牛构舟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播堵幽,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼狗超,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谐檀?” 一聲冷哼從身側(cè)響起抡谐,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤裁奇,失蹤者是張志新(化名)和其女友劉穎桐猬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刽肠,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡溃肪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了音五。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惫撰。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖躺涝,靈堂內(nèi)的尸體忽然破棺而出厨钻,到底是詐尸還是另有隱情,我是刑警寧澤坚嗜,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布夯膀,位于F島的核電站,受9級特大地震影響苍蔬,放射性物質(zhì)發(fā)生泄漏诱建。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一碟绑、第九天 我趴在偏房一處隱蔽的房頂上張望俺猿。 院中可真熱鬧,春花似錦格仲、人聲如沸押袍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伯病。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間午笛,已是汗流浹背惭蟋。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留药磺,地道東北人告组。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像癌佩,于是被迫代替她去往敵國和親木缝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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

  • 什么是Ajax 不刷新頁面的情況下從服務器獲取围辙、提交數(shù)據(jù)的一種數(shù)據(jù)交互方式我碟。 Ajax使用步驟 1\創(chuàng)建Ajax對...
    LaBaby_閱讀 270評論 0 0
  • 本文詳細介紹了 XMLHttpRequest 相關(guān)知識,涉及內(nèi)容: AJAX姚建、XMLHTTP矫俺、XMLHttpReq...
    semlinker閱讀 13,613評論 2 18
  • AJAX 原生js操作ajax 1.創(chuàng)建XMLHttpRequest對象 var xhr = new XMLHtt...
    碧玉含香閱讀 3,170評論 0 7
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)掸冤,斷路器厘托,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 大家好饺藤,我是IT修真院深圳分院第3期的學員包斑,一枚正直純潔善良的前端程序員,今天給大家分享一下涕俗,修真院官網(wǎng)前端工程師...
    大大頭大閱讀 7,556評論 1 72