AJAX

AJAX簡介:

AJAX(Asynchronous JavaScript and XML):異步的JavaScript和XML

AJAX不是新的編程語言,而是一種使用現(xiàn)有標(biāo)準(zhǔn)的新方法

AJAX最大的優(yōu)點(diǎn)是,在不加載整個(gè)頁面的情況下,實(shí)現(xiàn)與服務(wù)器交換數(shù)據(jù),并更新網(wǎng)頁的局部內(nèi)容

我們都知道submit的Form表單的提交方式,但是這種提交方式的缺點(diǎn)也是很大的,因?yàn)樗峤粫r(shí),刷新整個(gè)網(wǎng)頁。所以我們就有了AJAX。

timg.jpeg

XHR創(chuàng)建對象:

XMLHttpRequest對象用于在后臺與服務(wù)器交換數(shù)據(jù)

創(chuàng)建XMLHttpRequest對象

 var xmlhttp = new XMLHttpReques();

XMLHttpRequest對象的方法和屬性:

方法:

  • open("數(shù)據(jù)的提交方式","數(shù)據(jù)提交的地址","同步或者異步");
  • send("要提交的數(shù)據(jù)");
    屬性:
  • readyStatus:0-初始狀態(tài) 1-創(chuàng)建連接 2-向服務(wù)端發(fā)送數(shù)據(jù) 3-服務(wù)端返回?cái)?shù)據(jù) 4-數(shù)據(jù)接收完畢
  • responseText("服務(wù)器返回的數(shù)據(jù)");
    事件:
  • onreadystatechange:當(dāng)xhr狀態(tài)發(fā)生變化的時(shí)候會執(zhí)行
  • onload:數(shù)據(jù)接收完畢后執(zhí)行

模擬表單提交:FormData

var formdata = new FormData();

方法:append("傳給后臺的參數(shù)名","參數(shù)值");第二個(gè)值如果是文件的話 需要傳的是ele.files[0];

比如做個(gè)訂菜單的模擬前后臺的數(shù)據(jù)交互:

大概的流程是:后臺從數(shù)據(jù)庫里面拿到所有的菜單,然后傳到前臺,前臺接收數(shù)據(jù)之后,把json傳轉(zhuǎn)換為數(shù)組,遍歷,動態(tài)生成相對應(yīng)的菜單頁面,當(dāng)用戶選擇菜品輸入份數(shù),點(diǎn)擊提交之后,前臺向后臺發(fā)送用戶的選擇菜品的數(shù)據(jù),后臺拿到數(shù)據(jù)以后,經(jīng)過處理,返回給前臺。

效果的實(shí)現(xiàn)

前臺的代碼:

<form method="post" style="width: 320px;margin:100px auto;">
    <div style="text-align: center; font-size: 30px; margin-bottom:20px;">麗德快餐廳</div>
    <div id="show"></div>
    <input type="button" value="立即訂餐" id="btn">
</form>
<script>
    var form = document.getElementsByTagName("form")[0];
    var btn = document.getElementById("btn");
    var div1=document.getElementById('show');

    var xhr = new XMLHttpRequest();
    var formData = new FormData();
    formData.append("action","getmenu");
    xhr.open("post","menudata.php",true);
    xhr.send(formData);
    xhr.onload = function(){
        var jsonstr = JSON.parse(this.responseText);
        for(i in jsonstr){
            var div = document.createElement('div');
            div.className = "menu";
            div.innerHTML = ""+jsonstr[i][0]+"<input type='checkbox' name='key[]' value="+i+"/> "+jsonstr[i][1]+"元 訂餐份數(shù) <input type='text' name='amount_"+jsonstr[i][2]+"'/>"
            form.insertBefore(div,btn);
        }
    }
    
    btn.onclick = function(){
        var menuList = document.getElementsByClassName('menu');
//          console.log(menuList);
            //選中的checkbox傳到后臺
            var keyarr =[];
//          var namearr = [];
            var countarr = [];
            for(var i=0;i<menuList.length;i++){
                if(menuList[i].children[0].checked==true){
                    keyarr.push(i);
//                  namearr.push(menuList[i].childNodes[0].data);
                    countarr.push(menuList[i].children[1].value);
                }
            }
//          console.log(keyarr,countarr);
            //得到被選中的checkbox 形式是0,1
            var keystr = keyarr.join(",");
//          var namestr = namearr.join(",");
            var countstr = countarr.join(",");
//          console.log(keystr,namestr,countstr);
            
            var xhr1 = new XMLHttpRequest();
            var formData1 = new FormData();
            formData1.append("check","list");
            formData1.append("key",keystr);
//          formData1.append("name",namestr);
            formData1.append("count",countstr);
            xhr1.open("post","menudata.php",true);
            xhr1.send(formData1);
            xhr1.onload = function(){
                var totalPrice=0;
                var jsonstr1 = JSON.parse(this.responseText);
                div1.innerHTML = "您選擇的是:<br/>";
                for(i in jsonstr1){
                    div1.innerHTML += jsonstr1[i].name+jsonstr1[i].amount+"份 價(jià)格為:"+jsonstr1[i].price+"元<br>";
                    totalPrice+=jsonstr1[i].price;
                }
                div1.innerHTML+="總價(jià)為:"+totalPrice+"元";
//              console.log(jsonstr1);
            }
        }
    
    
</script>

后臺的代碼:

<?php

$fp = fopen("menu.txt","r");
while(!feof($fp)){
    $line = fgets($fp);
    $array = explode(" ",$line);
    if(!empty($array[0])){
        $menu[] = $array;       
    }
}


//如果用戶提交了數(shù)據(jù)
if(!empty($_POST)) {
    if(!empty($_POST['action'])&&$_POST['action']=="getmenu"){
        echo json_encode($menu);
        exit;
    }
    if($_POST['check']=="list"){
        $userSelected = array();
        $totalPrice = 0;
//      $name = explode(",",$_POST['name']);
        $keys = explode(",",$_POST['key']);
        $count = explode(",",$_POST['count']);
        foreach($keys as $key=>$val){
            //菜名
            $userSelected[$key]['name'] = $menu[$val][0];
            //份數(shù)
            $userSelected[$key]['amount'] = $count[$key];
            //價(jià)格=單價(jià)*份數(shù)
            $userSelected[$key]['price'] = $menu[$val][1] * $count[$key];
            //總價(jià)格
            $totalPrice += $userSelected[$key]['price'];
        }
        recordMenu($userSelected);  
        echo json_encode($userSelected);
        exit;
    }
}
function recordMenu($userSelected){
    $line="";
    foreach($userSelected as $key => $val) {
        $line .= "|".$val['name'].",".$val['amount'].",".$val['price']."|";
    }
    $line .="\n";
    $fp = fopen("record.txt", "a+");
    fwrite($fp, $line);
    fclose($fp);
}
?>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容