AJAX封裝

AJAX

是異步向服務(wù)器請(qǐng)求數(shù)據(jù),實(shí)現(xiàn)不刷新瀏覽器更新數(shù)據(jù)

組成

異步的JS
xhr對(duì)象
其他JS
服務(wù)器的數(shù)據(jù)

AJAX特點(diǎn)

提高了頁(yè)面渲染速度
提高了用戶體驗(yàn)
不需要插件支持

缺點(diǎn)

1.破壞了瀏覽器前進(jìn)和后退機(jī)制(因?yàn)閍jax自動(dòng)更新機(jī)制
2.一個(gè)Ajax請(qǐng)求多了,也會(huì)出現(xiàn)頁(yè)面加載慢的情況。
3.搜索引擎的支持程度比較低债查。
4.ajax的安全性問(wèn)題不太好(可以用數(shù)據(jù)加密解決)症昏。

AJAX的基本過(guò)程

使用ajax一共有4個(gè)步驟:1.創(chuàng)建ajax硼啤、2.連接服務(wù)器质况、3.發(fā)送請(qǐng)求聪富、4.接受返回值莺丑。

HTTP請(qǐng)求

HTTP請(qǐng)求有兩種方式

GET:用于獲取數(shù)據(jù),GET是在URL上傳遞數(shù)據(jù)(網(wǎng)址后面的東西)墩蔓,存儲(chǔ)量較少梢莽,安全系數(shù)比較低。
POST:用于上傳數(shù)據(jù)钢拧,POST安全性一般比(GET好一些)蟹漓,容量幾乎是無(wú)限(多用于表單)。

AJAX GET請(qǐng)求 過(guò)程的簡(jiǎn)單封裝

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <input type="text" id="name">
    <input type="text" id="age">
    <input type="button" id="btn" value="提交">
    <script>
        var oa=document.getElementById('name')
        var ob=document.getElementById('age')
        var obtn=document.getElementById('btn')

        
        
        obtn.onclick=function(){
            ajaxGet("http://localhost/php/php-get.php",function(res){
                alert(res)
            },{
                user:oa.value,
                age:ob.value
            })            
        }


        function ajaxGet(url,fn,date){                                //url 為 接口   fn 為執(zhí)行方法  date 是發(fā)送的數(shù)據(jù)
            date=date||{}
            var str=""
            for(var i in date){
                str+=`${i}=${date[i]}&`            
            }
            var d = new Date()                                        //在url上拼接一個(gè)時(shí)間戳 避免瀏覽器緩存問(wèn)題
            url=url+"?"+str+"sjc"+d.getTime()
            var xhr=new XMLHttpRequest();
                xhr.open('get',url);
                xhr.onreadystatechange=function(){
                    if(xhr.status==200&&xhr.readyState==4){
                        fn(xhr.responseText)
                    }else if(xhr.status!=200&&xhr.readyState==4){
                        fn(xhr.status)
                }
                xhr.send()
        }

    </script>
</body>
</html>
<?php
    $u = @$_GET["user"];
    $p = @$_GET["age"];
    // $u = @$_POST["user"];
    // $p = @$_POST["age"];

    echo "收到的數(shù)據(jù)是:".$u."-----".$p

?>

AJAX POST請(qǐng)求 過(guò)程的簡(jiǎn)單封裝

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <input type="text" id="name">
    <input type="text" id="age">
    <input type="button" id="btn" value="提交">
    <script>
        var oa=document.getElementById('name')
        var ob=document.getElementById('age')
        var obtn=document.getElementById('btn')

        

        obtn.onclick=function(){

            ajaxPost("http://localhost/php/php-post.php",function(res){
                alert(res)
            },{
                user:oa.value,
                age:ob.value
            })            
        }


        function ajaxPost(url,fn,date){
            date=date||{}
            var str=""
            for(var i in date){
                str+=`${i}=${date[i]}&`            
            }
            var d = new Date()
            url=url+"?"+"sjc="+d.getTime()
            console.log(url)
            var xhr=new XMLHttpRequest();
                xhr.open('post',url);
                xhr.onreadystatechange=function(){
                    if(xhr.status==200 && xhr.readyState==4){
                        fn(xhr.responseText)
                    }else if(xhr.status!=200&&xhr.readyState==4){
                        fn(xhr.status)
                }
                xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                xhr.send(str)
        }

    </script>
</body>
</html>
<?php

    // $u = @$_GET["user"];
    // $p = @$_GET["age"];
    $u = @$_POST["user"];
    $p = @$_POST["age"];

    echo "收到的數(shù)據(jù)是:".$u."-----".$p

?>

AJAX GET 和 POST 二合一的封裝

// 1.預(yù)設(shè)函數(shù)的執(zhí)行方式源内,和要傳入的參數(shù)葡粒,及要實(shí)現(xiàn)的功能
// ajax({
//     type:"get",             //可選,默認(rèn)get
//     url:"",                 //必選
//     success:function(){},   //必選
//     error:function(){},     //可選膜钓,默認(rèn)不處理
//     data:{}                 //可選嗽交,默認(rèn)不發(fā)
// })

function ajax(options){
    // 2.解析參數(shù),處理默認(rèn)參數(shù)
    let {type,url,success,error,data} = options;
    type = type || "get";
    data = data || {};
    // 3.解析要發(fā)送的數(shù)據(jù)
    var str = "";
    for(var i in data){
        str += `${i}=${data[i]}&`;
    }
    // 4.根據(jù)發(fā)送方式處理url
    if(type == "get"){
        var d = new Date();
        url = url + "?" + str + "sjc=" + d.getTime();
    }
    // 5.開(kāi)啟ajax
    var xhr = new XMLHttpRequest();
    xhr.open(type,url,true);
    xhr.onreadystatechange = function(){
        if(xhr.readyState == 4 && xhr.status == 200){
            success(xhr.responseText);
        }else if(xhr.readyState == 4 && xhr.status != 200){
            // 6.首先保證ajax的過(guò)程結(jié)束了颂斜,如果http給失敗夫壁,才是真正的失敗
            error && error(xhr.status);
            // if(error) error(xhr.status);
        }
    }
    // 7.根據(jù)發(fā)送方式,決定發(fā)送的信息
    if(type == "get"){
        xhr.send()
    }else if(type == "post"){
        xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        xhr.send(str.slice(0,str.length-1));
    }
}

AJAX GET/POST 和Jsonp三合一封裝

// 1.預(yù)設(shè)函數(shù)的執(zhí)行方式沃疮,和要傳入的參數(shù)盒让,及要實(shí)現(xiàn)的功能
// ajax({
//     type:"get",             //可選,默認(rèn)get
//     url:"",                 //必選
//     success:function(){},   //必選
//     error:function(){},     //可選司蔬,默認(rèn)不處理
//     data:{}                 //可選邑茄,默認(rèn)不發(fā)
//     timeout:毫秒數(shù)           //可選,默認(rèn)500俊啼,延遲時(shí)間肺缕,超出時(shí)間就出錯(cuò)誤,用在jsonp身上
// })

function ajax(options){
    // 2.解析參數(shù)授帕,處理默認(rèn)參數(shù)
    let {type,url,success,error,data,timeout} = options;
    type = type || "get";
    data = data || {};
    timeout = timeout || 500;
    // 3.解析要發(fā)送的數(shù)據(jù)
    var str = "";
    for(var i in data){
        str += `${i}=${data[i]}&`;
    }
    // 4.根據(jù)發(fā)送方式處理url
    // Jsonp1.處理url和數(shù)據(jù)
    if(type == "get" || type == "jsonp"){
        var d = new Date();
        url = url + "?" + str + "sjc=" + d.getTime();
    }
    
    // Jsonp2.區(qū)分jsonp和ajax的功能
    if(type === "jsonp"){
        var script = document.createElement("script");
        script.src = url;
        document.body.appendChild(script);

        window[data[data.columnName]] = function(res){
            success && success(res);
            error = null;
        }
        
        // Jsonp3.jsonp的失敗(超時(shí))
        setTimeout(() => {
            error && error("timeout");
            success = null;
        }, timeout);
    }else{
        // 5.開(kāi)啟ajax
        var xhr = new XMLHttpRequest();
        xhr.open(type,url,true);
        xhr.onreadystatechange = function(){
            if(xhr.readyState == 4 && xhr.status == 200){
                success(xhr.responseText);
            }else if(xhr.readyState == 4 && xhr.status != 200){
                // 6.ajax執(zhí)行成功 但網(wǎng)絡(luò)出錯(cuò) 才報(bào)錯(cuò)
                error && error(xhr.status);
                // if(error) error(xhr.status);
            }
        }
        // 7.根據(jù)發(fā)送方式同木,決定發(fā)送的信息
        if(type == "get"){
            xhr.send()
        }else if(type == "post"){
            xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            xhr.send(str.slice(0,str.length-1));//去掉多余的&
        }
    }
}

AJAX GET/POST 和Jsonp三合一封裝的調(diào)用

ajax({
    type:"get",             //可選,默認(rèn)get
    url:"",                 //必選
    success:function(){},   //必選
    error:function(){},     //可選跛十,默認(rèn)不處理
    data:{}                 //可選彤路,默認(rèn)不發(fā)
    timeout:毫秒數(shù)           //可選,默認(rèn)500芥映,延遲時(shí)間洲尊,超出時(shí)間缝裤,出錯(cuò)誤,用在jsonp身上
})
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颊郎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子霎苗,更是在濱河造成了極大的恐慌姆吭,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唁盏,死亡現(xiàn)場(chǎng)離奇詭異内狸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)厘擂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門昆淡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人刽严,你說(shuō)我怎么就攤上這事昂灵。” “怎么了舞萄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵眨补,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我倒脓,道長(zhǎng)撑螺,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任崎弃,我火速辦了婚禮甘晤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饲做。我一直安慰自己线婚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布艇炎。 她就那樣靜靜地躺著酌伊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缀踪。 梳的紋絲不亂的頭發(fā)上居砖,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音驴娃,去河邊找鬼奏候。 笑死,一個(gè)胖子當(dāng)著我的面吹牛唇敞,可吹牛的內(nèi)容都是我干的蔗草。 我是一名探鬼主播咒彤,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咒精!你這毒婦竟也來(lái)了镶柱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤模叙,失蹤者是張志新(化名)和其女友劉穎歇拆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體范咨,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡故觅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渠啊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片输吏。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖替蛉,靈堂內(nèi)的尸體忽然破棺而出贯溅,到底是詐尸還是另有隱情,我是刑警寧澤躲查,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布盗迟,位于F島的核電站,受9級(jí)特大地震影響熙含,放射性物質(zhì)發(fā)生泄漏罚缕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一怎静、第九天 我趴在偏房一處隱蔽的房頂上張望邮弹。 院中可真熱鬧,春花似錦蚓聘、人聲如沸邦危。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)堰怨。三九已至,卻和暖如春塘装,著一層夾襖步出監(jiān)牢的瞬間急迂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蹦肴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留僚碎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓阴幌,卻偏偏與公主長(zhǎng)得像勺阐,于是被迫代替她去往敵國(guó)和親卷中。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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

  • 原生js的ajax請(qǐng)求 傳統(tǒng)方法的缺點(diǎn): 傳統(tǒng)的web交互是用戶觸發(fā)一個(gè)http請(qǐng)求服務(wù)器,然后服務(wù)器收到之后,在...
    暮雨默默閱讀 979評(píng)論 0 2
  • 一、Ajax封裝 function request(){ ajax({ type:'POST',//請(qǐng)求類型 ur...
    晚溪呀閱讀 317評(píng)論 0 0
  • 用ajax的局部刷新來(lái)給網(wǎng)站提升用戶體驗(yàn)我們已經(jīng)用過(guò)很多了懒闷,ajax已然成為了前端開(kāi)發(fā)最重要的“工具”之一无埃。 但是...
    酒暖花深Q閱讀 278評(píng)論 0 2
  • AJAX 原生js操作ajax 1.創(chuàng)建XMLHttpRequest對(duì)象 var xhr = new XMLHtt...
    碧玉含香閱讀 3,201評(píng)論 0 7
  • 今天是新年開(kāi)工的日子,盡管19年已經(jīng)過(guò)去一個(gè)多月了毛雇,但今天才大家真正準(zhǔn)備奮斗起來(lái)的日子。 而我從畢業(yè)到如今7年半已...
    陳宋song閱讀 186評(píng)論 0 7