天天看点

Web前端-JavaScript--ajaxajax

ajax

目前我们所学习的 跟服务器交互手段比较主流的是form表单

但是,form表单的交互特点是: 会刷新整个页面  而且是同步加载(上面不请求完 下面没办法请求)

所以我们急需一种交互技术:

    可以实现 异步请求 局部刷新

 所以ajax应运而生:

   ajax特点: 异步请求 局部刷新

   ajax:  Asynchronous   JavaScript  And  XML

            异步的         js          和 xml

   如何发起一个ajax的网络请求:

    ajax五步骤

 AJAX的五步骤:

    *       1.构建异步请求对象(XMLHttpRequest)

    *

    *       2.调用open方法 打开链接 传入 请求方式 以及url等参数

    *

    *       3.调用send方法 发起网络请求

    *

    *       4.注册状态事件

    *

    *       5.在状态改变事件的驱动函数里面 判断状态 处理返回数据

    *

    *

    * 返回数据处理

    *

    *   经过我们观察 发现 readyState属性的五个状态 只有等于4的时候是数据响应成功

    *   所以我们要判断为4的时候处理数据

    *

    *   经过测试发现单单判断readyState不够 因为还需要判断 响应码是否是200

    *   status 属性返回200 才算是数据成功

    *

    *   经过成功返回打印ajax对象 我们看到 ajaxObj.responseText是返回字符串数据

PHP代码1

<?php
    header('Content-type:text/html;charset=utf-8');

//    获取客户端提交的POST数据
    $name=$_POST["username"];
    $pwd=$_POST["password"];

    echo "你post提交数据成功!--->$name ---->$pwd";


?>
           

 PHP代码2

<?php
    header('Content-type:text/html;charset=utf-8');
//    获取get方式提交的参数

    $name=$_GET["username"];
    $pwd=$_GET["password"];

    echo "你get提交数据成功!--->$name  --- $pwd";


?>
           

html代码

var btnArr=document.getElementsByTagName("button");
    var h1=document.getElementsByTagName("h1")[0];
    btnArr[0].onclick=function () {
//         1.构建异步请求对象(XMLHttpRequest)
        var ajaxObj=new XMLHttpRequest();
//        2.调用open方法 打开链接 传入 请求方式 以及url等参数
        ajaxObj.open("get","php/data/qq.txt");
//        3.调用send方法 发起网络请求
        ajaxObj.send();
//        4.注册状态事件
        ajaxObj.onreadystatechange=function () {
//            5.在状态改变事件的驱动函数里面 判断状态 处理返回数据
//            console.log("访问成功啦!");

            if(ajaxObj.readyState==4 && ajaxObj.status==200){
                /*console.log(ajaxObj.readyState)
                console.log("访问成功啦!");*/
                console.log(ajaxObj.responseText);
            }
        }
    }
    
    btnArr[1].onclick=function () {
//        1.构建异步请求对象
        var ajaxObj=new XMLHttpRequest();
//        2.open方法 传入 请求方式 url等参数
        ajaxObj.open("get","php/03.ajaxGetData.php");
//        3.send方法 发起网络请求
        ajaxObj.send();
//        4.注册状态改变事件
        ajaxObj.onreadystatechange=function () {
//            5.处理返回数据
            if(ajaxObj.readyState==4 && ajaxObj.status==200){
//                console.log(ajaxObj.responseText);
                h1.innerHTML=ajaxObj.responseText;

            }
        }
        
    }
           

 ajax兼容性写法

//创建ajax的兼容写法
function createXHR()
{
	var req = null;
	
	if(window.XMLHttpRequest)
	{
		req = new XMLHttpRequest();
	}
	else
	{
		req = new ActiveXObject("Microsoft.XMLHTTP");
	}
	return req;
}

           

get请求和post请求的区别:

           get偏向从服务器获取数据(顺带着给服务器提交一些简单数据)

           post偏向给服务器提交大量数据

        向服务器提交数据get和post分别如何处理:

            get方式向服务器提交数据:

                url后面?问号拼接参数

                    ajaxObj.open("get","服务器地址?键1=值1&键2=值2...")

             post方式向服务器提交数据:

                ajaxObj.send("键1=值1&键2=值2.....")

        经过测试发现: form表单post提交参数是:

            请求头里面的Content-type的值是: application/x-www-form-urlencoded

            ajax默认的post提交并不是这种请求头的方式  所以我们要自己修改

           ajaxObj.setRequestHeader("键","值")

           ajaxObj.setRequestHeader("Content-type","application/x-www-form-urlencoded")

           要在open之后 send之前设置

get请求:

    提交的参数在地址栏(也就是请求头里面)

    速度相对更快

    get方式请求 不安全

           不安全体现在 get方式可以被缓存 被存入书签 被加入收藏夹 有历史记录

 post请求:

    提交的参数 在请求体里面

    速度相对慢一点

    post方式 相对安全

php代码1

<?php
    header('Content-type:text/html;charset=utf-8');
//    获取客户端post提交的数据
    $name=$_POST["username"];
    $pwd=$_POST["password"];

    echo "我是服务器的post数据,你post到了么?参数是:$name <----->$pwd";
?>
           

 php代码2

<?php
    header('Content-type:text/html;charset=utf-8');

//    接收客户端get方式提交过来的数据
    $name=$_GET["username"];
    $pwd=$_GET["password"];
    echo "我是服务器get数据,你get到了么?参数是:$name <---->$pwd";

?>
           

html代码

<script>
    var btnArr=document.getElementsByTagName("button");
    var username=document.getElementById("username");
    var password=document.getElementById("password");
    btnArr[0].onclick=function () {
        var ajaxObj=new XMLHttpRequest();
        ajaxObj.open("post","php/04.ajaxPostData.php");
        ajaxObj.send();
        ajaxObj.onreadystatechange=function () {
            if(ajaxObj.readyState===4 && ajaxObj.status===200){
                console.log(ajaxObj.responseText);
                
            }
        }




    }
    btnArr[1].onclick=function () {
        var ajaxObj=new XMLHttpRequest();
//        ajaxObj.open("get","php/03.ajaxGetData.php?username=mingzhao&password=123456");
        var name=username.value;
        var pwd=password.value;
        ajaxObj.open("get","php/03.ajaxGetData.php?username="+name+"&password="+pwd);
        ajaxObj.send();
        ajaxObj.onreadystatechange=function () {
            if(ajaxObj.readyState==4 && ajaxObj.status==200){
                console.log(ajaxObj.responseText);
                
            }
        }


    }

    btnArr[2].onclick=function () {
        var name=username.value;
        var pwd=password.value;


        var ajaxObj=new XMLHttpRequest();
        ajaxObj.open("post","php/04.ajaxPostData.php");
        ajaxObj.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        ajaxObj.send("username="+name+"&password="+pwd);
        ajaxObj.onreadystatechange=function () {
            if(ajaxObj.readyState==4 && ajaxObj.status==200){
                console.log(ajaxObj.responseText);

            }
        }

    }




</script>
           

获取明星头像案例

php代码

<?php
    header('Content-type:text/html;charset=utf-8');
    $starname=$_GET["starname"];

    switch($starname){
        case "赵丽颖":
            echo "http://static.yufenghen.cn/starimg/liying.jpg";
            break;
        case "杨颖":
            echo "http://static.yufenghen.cn/starimg/baby.jpg";
            break;
        case "杨幂":
            echo "http://static.yufenghen.cn/starimg/mi.jpg";
            break;

    };

?>
           

html代码

<!DOCTYPE html>
<html >
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #box{
            width: 200px;
            height: 200px;
            border: 1px solid #e4393c;
            margin: 50px auto;
            /*background: url("http://static.yufenghen.cn/starimg/liying.jpg") no-repeat center/cover;*/
            background-repeat: no-repeat;
            background-position: center;
            background-size:cover;
        }
        P{
            text-align: center;
        }



    </style>
</head>
<body>
<div id="box">
    
</div>
<p>
    <button>赵丽颖</button>
    <button>杨颖</button>
    <button>杨幂</button>
    
</p>
<script>
        var btnArr=document.getElementsByTagName("button");
        var box=document.getElementById("box");
        for(var i=0;i<btnArr.length;i++){
            btnArr[i].onclick=function () {
                var ajaxObj=new XMLHttpRequest();
                ajaxObj.open("get","php/05.getStarHead.php?starname="+this.innerHTML);
                ajaxObj.send();
                ajaxObj.onreadystatechange=function () {
                    if(ajaxObj.readyState==4 && ajaxObj.status==200){
//                        console.log(ajaxObj.responseText);
                        box.style.backgroundImage="url('"+ajaxObj.responseText+"')";

                    }
                }
            }
        }





</script>


</body>
</html>
           

获取明星头像案例(xml格式)

   我们通过观察浏览器的network发现

        本次请求虽然数据请求到了  但是ajaxObj.responseXML返回的却是null

        因为 response Header (响应头) 里面的Content-type是 text/html

        这样表示告诉前端浏览器 接收到的是一个html文本

        所以ajax的responseXML无法解析 就返回null

        所以我们应该让服务器吧 text/html改成xml的标识格式

        一旦服务器返回了正确的mime类型的xml数据

        那么ajaxObj.responseXML返回的就是跟xml文件数据有关的document对象

        有了这个对象 我们就可以进行xml数据的解析(dom对象针对标签节点的增删改查)

html

<!DOCTYPE html>
<html >
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button>根据xml数据渲染表格</button>
<table id="tab" >

</table>
<script>
    var tab=document.getElementById("tab");
    var btn=document.getElementsByTagName("button")[0];

    btn.onclick=function () {
        //1.构建对象
        var ajaxObj=new XMLHttpRequest();
        //2.打开连接
        ajaxObj.open("get","php/02.getStarInfoByXML.php");
        //3.发送数据
        ajaxObj.send();
        //4.注册事件
        ajaxObj.onreadystatechange= function () {
            //处理数据
            if(ajaxObj.readyState===4 && ajaxObj.status===200){
              console.log(ajaxObj.responseXML);
//              console.log(document);
                var xmlDOM=ajaxObj.responseXML;
                var starArr=xmlDOM.getElementsByTagName("star");
//                console.log(starArr);
                var str="";
                for(var i=0;i<starArr.length;i++){
                    str+="<tr>";
                    var nameNode=starArr[i].getElementsByTagName("name")[0];
                    var headimgNode=starArr[i].getElementsByTagName("headimg")[0];
                    var desNode=starArr[i].getElementsByTagName("description")[0];

//                    console.log(nameNode.innerHTML+"  "+headimgNode.innerHTML+"  "+desNode.innerHTML);

                    str+="<td>"+nameNode.innerHTML+"</td>";
                    str+="<td><img width='100' src='"+headimgNode.innerHTML+"'></td>";
                    str+="<td>"+desNode.innerHTML+"</td>";


                    str+="</tr>";
                }
//                console.log(str);
                tab.innerHTML=str;
            }
        }
    }




</script>

</body>
</html>
           

php

<?php
                      //text/html 这个类型有一个学名:  MIME类型
                      //所谓MIME类型是指  前后端交互时 互相沟通文件数据类型的一个标识
                      //MIME类型不是瞎写的  而是有一套固定的 MIME类型表
        //MIME类型要跟返回的数据保持一致  这样前端的 responseXML才能解析
//    header('Content-type:text/html;charset=utf-8');
    header('Content-type:application/xml;charset=utf-8');

    echo  file_get_contents("data/star.xml");
?>
           

获取明星头像案例(json格式)

    json格式

//最外层是[] 的  表示当前json里面的数据是一个数组类型

//最外层是{} 的 表示当前json里面的数据是一个 对象类型

html

<!DOCTYPE html>
<html >
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button>根据json数据渲染表格</button>
<table id="tab" >

</table>
<script>
    var tab=document.getElementById("tab");
    var btn=document.getElementsByTagName("button")[0];


    btn.onclick=function () {
        //1.构建对象
        var ajaxObj=new XMLHttpRequest();
        //2.打开连接
        ajaxObj.open("get","php/03.getStarInfoByJson.php");
        //3.发送数据
        ajaxObj.send();
        //4.注册事件
        ajaxObj.onreadystatechange= function () {
            //处理数据
            if(ajaxObj.readyState===4 && ajaxObj.status===200){
//              console.log(ajaxObj.responseText);
//              将json字符串转换成json对象
//              console.log(JSON.parse(ajaxObj.responseText));
            var starArr=JSON.parse(ajaxObj.responseText);
            for(var i=0;i<starArr.length;i++){
                var newTr=document.createElement("tr");
                var newTd1=document.createElement("td");
                var newTd2=document.createElement("td");
                var newTd3=document.createElement("td");
                var newTd4=document.createElement("td");
                var newTd5=document.createElement("td");
                newTd1.innerHTML=starArr[i].name;
                newTd2.innerHTML="<img width='100' src='"+starArr[i].headimg+"'>";
                newTd3.innerHTML=starArr[i].des;
                newTd4.innerHTML="<button>编辑</button>"
                newTd5.innerHTML="<button>删除</button>"

                newTr.appendChild(newTd1)
                newTr.appendChild(newTd2)
                newTr.appendChild(newTd3)
                newTr.appendChild(newTd4)
                newTr.appendChild(newTd5)


                tab.appendChild(newTr);
            }



            }
        }
    }


/*ajax_get("get服务器","键1=值1&键2=值2",function () {

})
ajax_post("post服务器","键1=值1&键2=值2",function () {

})
    ajax_all("get服务器","get","键1=值1&键2=值2",function () {

    })
    ajax_all("post服务器","post","键1=值1&键2=值2",function () {

    })
    
    ajax_tools({
        url:"服务器地址",
        type:"请求方式get/post",
        data:"键1=值1&键2=值2",
        success:function () {
            //处理返回数据
        }
        
        
    })

    $.ajax({
        url:"服务器地址",
        type:"请求方式get/post",
        data:"键1=值1&键2=值2",
        success:function () {
            //处理返回数据
        }
    })*/

</script>

</body>
</html>
           

php

<?php
//    header('Content-type:text/html;charset=utf-8');
    header('Content-type:application/json;charset=utf-8');

    echo file_get_contents("data/star.json");


?>
           

        xml格式的数据和json数据的区别以及优缺点:

            xml:

                优点:

                    数据格式古老  几乎所有设备都支持

                    可读性强

                缺点:

                    数据的大小比较大  会占传输数据的空间  闭合标签表示一个数据

            json:

                优点:

                    格式内容比较小 几个简单的符号就表示了很复杂的数据

                    兼容性也是很好 因为是字符串嘛  使用的最多

                    现在几乎所有语言都支持json解析

            前后端分离开发:

                就是前端页面不再嵌套后台语言 就是单独的前端页面

                数据是通过交互手段  进行json和xml数据格式的交互

                进行页面渲染

get方法的封装

        参数配置:

            1.服务器地址(字符串)

            2.参数字符串(键=值&键=值)

            3.回调函数(数据成功返回的方法)

html

<script>
    var btnArr=document.getElementsByTagName("button");

    btnArr[0].onclick=function () {
        /*ajax_get("php/04.getServer.php",null,function (res) {
            console.log(res.responseText);
            
        })*/

        ajax_get("php/04.getServer.php","username=小强&password=123456",function (res) {
            console.log(res.responseText);

        })


    }


    function ajax_get(url,data,callback) {

        var ajaxObj=new XMLHttpRequest();
//        如果有需要提交的参数 再拼接
        if(data){
            url=url+"?"+data;
        }
        ajaxObj.open("get",url);
        ajaxObj.send();
        ajaxObj.onreadystatechange=function () {
            if(ajaxObj.readyState===4 && ajaxObj.status===200){
                if(typeof callback=="function"){
                    callback(ajaxObj)

                }
            }
            /*
                以下是可以针对所有可能出现的错误返回进行分别不同的处理
            else if(ajaxObj.readyState===4 && ajaxObj.status===404){
                if(typeof error=="function"){
                    error(ajaxObj)

                }
            }

            else if(ajaxObj.readyState===4 && ajaxObj.status===500){
                if(typeof qq=="function"){
                    qq(ajaxObj)

                }
            }
            else if(ajaxObj.readyState===3 && ajaxObj.status===200){
                if(typeof ww=="function"){
                    ww(ajaxObj)

                }
            }*/
        }
        
    }
//    ajax_get("地址","username=xx&password=123456")
//    ajax_get("地址",null)

    
    
</script>
           

php

<?php
    header('Content-type:text/html;charset=utf-8');
    $name=$_GET["username"];
    $pwd=$_GET["password"];

    echo "我是服务器get数据,你get到了么?---->$name ----$pwd";
?>
           

ajax_post封装

*           参数配置:

*               1.url地址

*               2.data参数

*               3.回调函数

html

function ajax_post(url,data,callback) {
        if(!url){
//            如果没有url地址  则无法请求
            return;

        }
        var ajaxObj=new XMLHttpRequest();
        ajaxObj.open("post",url);
        ajaxObj.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        if(data){
//            如果有参数就发送
            ajaxObj.send(data);
        }else{
//            没有就不传入参数
            ajaxObj.send();
        }
        ajaxObj.onreadystatechange= function () {
            if(ajaxObj.readyState===4 && ajaxObj.status===200){
                    if(typeof callback=="function"){
                        callback(ajaxObj)

                    }
            }
        }


    }
           

php

<?php
    header('Content-type:text/html;charset=utf-8');


    $name=$_POST["username"];
    $pwd=$_POST["password"];

    echo "我是服务器post数据,你post到了么?--->$name ----$pwd";

?>
           

  ajax_all方法的封装

            参数配置:

                1.url 服务器地址

                2.method请求方式(get/post)

                3.data参数

                4.回调函数

html

function ajax_all(url,method,data,callback) {
        if(!url){
            return;
        }

        var ajaxObj=new XMLHttpRequest();

        if(method && method.toUpperCase()=="POST"){
//            匹配到这 只有这么几个值:  post  POST  Post poSt....

            ajaxObj.open(method,url);
            ajaxObj.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            if(data){
                ajaxObj.send(data);
            }else{
                ajaxObj.send();
            }


        }else{
//            其他一切情况 直接暴力的 把它该成  get方式
            method="get";
            if(data){
                url=url+"?"+data;

            }
            ajaxObj.open(method,url);
            ajaxObj.send();
        }
        ajaxObj.onreadystatechange=function () {
            if(ajaxObj.readyState===4 && ajaxObj.status===200){
                if(typeof callback=="function"){
                    callback(ajaxObj);

                }

            }
        }

    }
           

php

<?php
    header('Content-type:text/html;charset=utf-8');
   $name=$_POST["username"];
    $pwd=$_POST["password"];


  /*$name=$_GET["username"];
    $pwd=$_GET["password"];*/
    echo "我是服务器数据,你是get还是post来的?---->$name   -----$pwd";
//    echo "我是服务器数据,你是get还是post来的?";

?>
           

ajax_tools封装

    *       参数配置:

    *           settings:对象

    *               对象包含属性: url

    *                           type(GET/POST)

    *                           data

    *                           success

function ajax_tools(settings) {
        if(!settings.url){
            return;
        }

        var ajaxObj=new XMLHttpRequest();

        if(settings.type && settings.type.toUpperCase()=="POST"){
//            匹配到这 只有这么几个值:  post  POST  Post poSt....

            ajaxObj.open(settings.type,settings.url);
            ajaxObj.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            if(settings.data){
                ajaxObj.send(settings.data);
            }else{
                ajaxObj.send();
            }


        }else{
//            其他一切情况 直接暴力的 把它该成  get方式
            settings.type="get";
            if(settings.data){
                settings.url=settings.url+"?"+settings.data;

            }
            ajaxObj.open(settings.type,settings.url);
            ajaxObj.send();
        }
        ajaxObj.onreadystatechange=function () {
            if(ajaxObj.readyState===4 && ajaxObj.status===200){
                if(typeof settings.success=="function"){
                    settings.success(ajaxObj);

                }

            }
        }


    }
           

               php

<?php
    header('Content-type:text/html;charset=utf-8');
   $name=$_POST["username"];
    $pwd=$_POST["password"];


  /*$name=$_GET["username"];
    $pwd=$_GET["password"];*/
    echo "我是服务器数据,你是get还是post来的?---->$name   -----$pwd";
//    echo "我是服务器数据,你是get还是post来的?";

?>
           

继续阅读