ajax

一、概述

1.定义

ajax_h5

2.异步与同步

ajax_h5_02

二、XMLHttpRequest

浏览器内建对象,用于在后台与服务器通信(交换数据) , 由此我们便可实现对网页的部分更新,而不是刷新整个页面。

<!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>
    <style>
        body {
            text-align: center;
        }

        .info {
            width: 500px;
            height: 200px;
            border: 1px solid red;
            margin: 50px auto;
        }
    </style>
</head>

<body>
    <h1>ajax</h1>
    <p>可以在页面不刷新的情况下,请求服务器,局部更新页面的数据;</p>
    <input type="text"> <button>发送请求</button>
    <div class="info"></div>
    <script>
        //本质: 是在HTTP协议的基础上通过js的XMLHttpRequest对象与服务器进行通信。


        document.querySelector('button').onclick = function () {

            //1-创建一个XMLhttpRequest实例
            // var date = new Date();
            var xhr = new XMLHttpRequest();

            //2-把请求报文设置好
            // 2-1请求行
            xhr.open('get', './01-ajax.php');
            // 2-2请求头
            xhr.setRequestHeader('content-type', 'text/html');
            // 2-3请求主体
            //get请求报文没有请求主体 ,发送null
            xhr.send(null);


            //3-接受服务器响应内容
            // 服务器何时响应,是不确定,会受到各种外界因素影响, 所有以一直等待服务器响应;用事件监听
            //监听XMLHttpRequest的状态 变化
            // readyState == 4 表示服务器响应完成
            xhr.onreadystatechange = function () {
                // 如果服务器响应完成 并且 成功处理请求,则获取数据
                if (xhr.readyState == 4 && xhr.status == 200) {
                    //获取服务器响应的结果(获取响应主体中的数据)
                    var r = xhr.responseText;
                    console.log(r);
                    document.querySelector('.info').innerHTML = r;

                }
            }



        }



    </script>
</body>



</html>

1.发送get请求

ajax_h5_03

<!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>
    <style>
        body {
            text-align: center;
        }

        .info {
            width: 500px;
            height: 200px;
            border: 1px solid red;
            margin: 50px auto;
        }
    </style>
</head>

<body>
    <h1>ajax - get</h1>
    <p>可以在页面不刷新的情况下,请求服务器,局部更新页面的数据;</p>
    <input type="text"> <button>发送请求</button>
    <div class="info"></div>
    <script>
        //点击按钮,获取输入框的值,通过ajax发送给后台
        document.querySelector('button').onclick = function () {
            var txt = document.querySelector('input').value;
            //利用ajax发送数据给后台
            //1-创建一个XMLHttpRequest对象
            var xhr = new XMLHttpRequest();

            //2-设置请求报文
            //2-1请求行
            xhr.open('get', './02-ajax-get.php?name='+txt);
            //2-2请求头
            xhr.setRequestHeader('content-type', 'text/html');
            //2-3请求主体
            xhr.send(null);

            //3-监听服务器响应
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var r = xhr.responseText;
                    //显示
                    document.querySelector('.info').innerHTML = r;
                }
            }
        }

    </script>
</body>

</html>

2.发送post请求

ajax_ajax_04

<!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>
    <style>
        body {
            text-align: center;
        }

        .info {
            width: 500px;
            height: 200px;
            border: 1px solid red;
            margin: 50px auto;
        }
    </style>
</head>

<body>
    <h1>ajax - post</h1>
    <p>可以在页面不刷新的情况下,请求服务器,局部更新页面的数据;</p>
    <input type="text"> <button>发送请求</button>
    <div class="info"></div>
    <script>
        //点击按钮,获取输入框的值,通过ajax发送给后台
        document.querySelector('button').onclick = function () {
            var txt = document.querySelector('input').value;
            //利用ajax向数据发送给后台
            //1-创建一个XMLHttpRequest对象
            var xhr = new XMLHttpRequest();
            //2-设置请求报文
            //2-1请求行
            xhr.open('post', './03-ajax-post.php');
            //2-2请求头
            //必须设置content-type属性
            xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
            //2-3请求主体
            xhr.send('name=' + txt+'&sex=m');

            //3-监听服务器响应
            xhr.onreadystatechange = function () {
                if (xhr.readyState ==4 && xhr.status == 200) {
                    var r = xhr.responseText;
                    document.querySelector('.info').innerHTML = r;
                }
            }
        }

    </script>
</body>

</html>

3.获取响应

ajax_h5_05

4.案例

聊天机器人

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Ajax</title>
    <style>
        body {
            margin: 0;
            padding: 0;
            background-color: #F7F7F7;
        }

        h3 {
            text-align: center;
        }

        .chatbox {
            width: 500px;
            height: 500px;
            margin: 0 auto;
            border: 1px solid #CCC;
            background-color: #FFF;
            border-radius: 5px;
        }

        .messages {
            height: 350px;
            padding: 20px 40px;
            box-sizing: border-box;
            border-bottom: 1px solid #CCC;
            overflow: scroll;
        }

        .messages h5 {
            font-size: 20px;
            margin: 10px 0;
        }

        .messages p {
            font-size: 18px;
            margin: 0;
        }

        .self {
            text-align: left;
        }

        .other {
            text-align: right;
        }

        .form {
            height: 150px;
        }

        .form .input {
            height: 110px;
            padding: 10px;
            box-sizing: border-box;
        }

        .form .btn {
            height: 40px;
            box-sizing: border-box;
            border-top: 1px solid #CCC;
        }

        .form textarea {
            display: block;
            width: 100%;
            height: 100%;
            box-sizing: border-box;
            border: none;
            resize: none;
            outline: none;
            font-size: 20px;
        }

        .form input {
            display: block;
            width: 100px;
            height: 30px;
            margin-top: 5px;
            margin-right: 20px;
            float: right;
        }
    </style>
</head>

<body>
    <h3>简单的Ajax实例</h3>
    <div class="chatbox">
        <!-- 聊天内容 -->
        <div class="messages">
            <!-- <div class="self">
                <h5>我说</h5>
                <p>你好</p>
            </div>
            <div class="other">
                <h5>对方说</h5>
                <p>你好</p>
            </div> -->
        </div>
        <!-- 表单 -->
        <div class="form">
            <!-- 输入框 -->
            <div class="input">
                <textarea></textarea>
            </div>
            <!-- 按钮 -->
            <div class="btn">
                <input type="button" value="发送">
            </div>
        </div>
    </div>

    <!-- 这个先忽略,春哥说的 -->
    <script type="text/template">
		<div class="self">
			<h5>我说</h5>
			<p>你好</p>
		</div>
		<div class="other">
			<h5>对方说</h5>
			<p>你好</p>
		</div>
    </script>

    <script>
        //聊天案例思路
        // 1-点击发送按钮,获取输入框的值,添加到消息窗口中
        // 2-将聊天内容发送给服务器, 接受服务器返回的消息
        // 3-将服务器返回的内容,添加到消息窗口中

        var messages = document.querySelector('.messages');
        var textarea = document.querySelector('textarea');

        //1-给发送按钮绑定点击事件
        document.querySelector('input').onclick = function () {
            //获取输入框的值
            var txt = textarea.value;
            // alert(txt);
           
            //添加到消息窗口中
            messages.appendChild( setMsg('self', txt) );

            //清空输入框
            textarea.value = '';

            //将聊天内容发送给服务器, 接受服务器返回的消息
            //1-创建一个XMLHttpRequest对象
            var xhr = new XMLHttpRequest();
            //2-设置请求报文
            //2-1请求行
            xhr.open('post', './chat.php');
            //2-2请求头
            xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
            //2-3请求主体
            xhr.send('msg=' + txt);

            //3-监听服务器响应
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4 && xhr.status == 200) {

                    var r = xhr.responseText; //获取服务器返回 的结果
                    console.log(r);
                    //把消息先包装,在添加在messages
                    messages.appendChild( setMsg('other', r) );
                }
            }

        }


        //生成消息
        // flag : 谁说的 self other 
        // msg: 聊天内容
        function setMsg(flag, msg) {
            //先报消息进行包装
            var div = document.createElement('div');
            var h5 = document.createElement('h5');
            var p = document.createElement('p');

            //设置样式和内容
            if (flag == 'self') {
                div.className = 'self';
                h5.innerHTML = '我说:';
            } else {
                div.className = 'other';
                h5.innerHTML = '对方说:';
            }
            p.innerHTML = msg;

            //建立父子关系
            div.appendChild(h5);
            div.appendChild(p);

            return div; //把拼接好结构返回

        }

    </script>

</body>

</html>

三、数据交互

ajax_ajax_06

1.XML

什么是XML

ajax_h5_07

语法规范

ajax_ajax_08

php获取xml文件的内容

ajax_h5_09

html解析xml

ajax_html_10

2.JSON数据

ajax_ajax_11

php处理json

ajax_html_12

JS处理json

ajax_h5_13

四、兼容性处理

ajax_xml_14

五、封装ajax工具函数

ajax_html_15
完整代码

var $={
      ajax:function(obj){
        //获取用户的参数
        var type=obj.type||'get'; //默认请求方式是get
        var url=obj.url||location.href; //默认请求当前页面
        var callback=obj.callback;
        //1-js中使用对最方便接受的参数是对象,但是传递给服务器的格式 name=zs&age=18
        var data=this.setParam(obj.data); //name=zs&age=18

        // console.log(data);
        //封装ajax公共代码部分
        //1-创建XMLHttpRequest对象
        var xhr=new XMLHttpRequest();

        //模拟http协议
        //如果是get请求在url后面拼接参数
        if(type=='get'){
            url=url+'?'+data;
            data=null;
        }
        //1-请求行
        xhr.open(type,url);
        //2-请求头 post 必须设置请求头
        if(type=='post'){
            xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
        }
        //3-请求主体
        xhr.send(data);

        //监听服务器的响应
        xhr.onreadystatechange=function(){
            if(xhr.readyState==4 &&xhr.status==200){
                var r=xhr.responseText;//获取响应主体
                //r中就是服务器返回核心数据 需要渲染
                callback&&callback(r);
            }
        }
    },
  	
    //将对象转成 name=zs&age=18
    setParam:function(obj){
        
        if(typeof obj =='object'){ 
            var str='';                  
            for(var k in obj){
                str+=k+'='+obj[k]+'&';
            }
            str=str.substr(0,str.length-1); //参数一:开始索引 参数二:截取长度
        }

        return str;//返回转换后的字符串
    }
};

六、jQuery中的ajax方法

jQuery为我们提供了更强大的Ajax封装

1.$.ajax

ajax_xml_16
ajax_服务器_17

2.其他api

ajax_xml_18

3.接口化开发

ajax_html_19
ajax_xml_20

七、模板引擎

是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。

1.为什么要使用模板引擎

ajax_xml_21

2.常见的模板引擎

ajax_xml_22

3.artTemplate的使用

artTemplate入门

ajax_html_23
ajax_xml_24

artTemplate语法

ajax_html_25

八、同源与跨域

1.同源

不同源 则跨域

同源策略的基本概念

ajax_xml_26

同源策略的目的

同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据

同源策略的限制范围

ajax_ajax_27

2.跨域

jsonp

ajax_html_28

jsonp演化过程

jsonp原理大家知道即可,不用太过于去纠结这个原理,因此jquery已经帮我们封装好了,我们使用起来非常的方便

jquery对于jsonp的封装

ajax_html_29

九、XMLHttpRequest 2.0

ajax_h5_30

1.timeout设置超时

ajax_h5_31

2.formData管理表单数据

ajax_xml_32

3.文件上传

ajax_h5_33

4.显示文件进度信息

ajax_xml_34

十、跨域资源共享(CORS)

1.cors的使用

ajax_h5_35

2.CORS的具体流程

ajax_xml_36

3.其他的跨域手段

ajax_xml_37

4.虚拟主机配置

ajax_ajax_38
ajax_h5_39