zoukankan      html  css  js  c++  java
  • ajax学习笔记(二)

    1、什么是Ajax?
        1)简述:
                ajax是一种创建交互网页应用的一门技术。可以实现发送http请求获取数据的操作。
        2)目标:
                无刷新加载页面。
        3)必要性:
                解决多余无用的网络请求

    2、ajax的优缺点
        优点:1)实现局部更新(无刷新状态下)
                  2)减轻了服务器端的压力
        缺点:1)破坏了浏览器前进和后退机制(因为ajax自动更新机制)
                  2)一个Ajax请求多了,也会出现页面加载慢的情况。
                  3)搜索引擎的支持程度比较低。
                  4)ajax的安全性问题不太好(可以用数据加密解决)
     

    3、HTTP请求
        GET:用于获取数据,GET是在URL上传递数据(网址后面的东西),存储量较少,安全系数比较低。
        POST:用于上传数据,POST安全性一般比(GET好一些),容量几乎是无限(多用于表单)。
     

    4、Ajax的使用
        1)创建ajax;
         2)连接服务器;
         3)发送请求;
         4)接受返回值;
     
        1)创建ajax
            创建ajax必须考虑兼容性处理,
             IE6以上:new XMLHttpRequest()、
             IE6:new ActiveXObject("Microsoft.XMLHTTP")
              兼容处理:
                    var xhr = null;
                    if(window.XMLHttpRequest){
                        xhr = new XMLHttpRequest();
                    } else{
                        xhr = new ActiveXObject("Mricosoft.XMLHTTP");
                    }
     
         2)连接服务器
                xhr.open("请求方式(GET/POST)",url路径,“异步/同步”)
                    a、参数一:请求方式(GET|POST)   
                     b、参数二:地址(url)
                     c、参数三:是否为异步(true|false)-----默认为true
                    当请求方式为POST的时候,代码写法如上
                    当请求方式为GET的时候,使用xhr.open("请求方式(GET/POST)",url路径 + “?”请求数据 +  ,“异步/同步”)
     
         3)发送请求
                xhr.send()发送请求
                    当请求方式为GET的时候,发送请求为xhr.send(null).
                    当请求方式为POST的时候,发送请求为xhr.send(请求数据)。
                    使用POST的时候必须在xhr.send(请求数据)上面添加:
                        xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                
         4)接受返回值---事件
                1)readystatechange事件:当请求被发送到服务器时,我们需要执行一些基于响应的操作。
                        xhr.onreadystatechange = function( ){ }
                        a、请求状态:( readyState  )
                            0(未初始化)open还没有调用;
                            1(载入)已经调用了send()正在发送请求;
                            2(载入完成)send方法已经完成  已经收到了全部的响应内容
                            3(解析)正在解析响应内容
                            4(完成)响应内容解析完成  可以在客户端用了
                        b、返回请求的结果码:( status )
                            200(成功)
                            404(未找到)
                            返回5**(5开头)(服务器错误)
                2)onload事件:只有当请求状态为4的时候执行
                        xhr.onload = function( ){ }
                3)onprogress事件:进度条
                        xhr.onprogress = function( ){ }

    5、关于封装:
        避免紧密耦合,参数在逻辑中可以进行判断.
        原则:封装的ajax,在使用时一定不能去更改封装内部的东西,把可能更改的所有内容、功能都提取成参数。
                1)提取参数:不一样的东西,提取成参数。    ---路径=>变量,功能=>函数
                2)提取参数的作用:保证函数的复用性  =>  当使用函数的时候,不进行变更就可以实现功能。
     
    function GetAjax(url,callback){
        var xhr=new XMLHttpRequest();
        xhr.open("GET",url);
        xhr.send(null);
        xhr.onload=function(){
            if(xhr.state===200){
                callback(xhr.response);
            }
        }
    }
     

    6、关于封装问题
        1)ajax执行顺序:
            a、因为ajax的回调函数执行的顺序因为网络环境的问题,是不可控的,
            b、为了解决这个问题,可以使用函数嵌套函数,但是这种方式会造成回调地狱,
            c、解决回调地狱的方式:promise
     
     

    7、promise -----详情见Promise
     

    8、AJAX的Promise封装
        1)GET方式:
    function GetAjax(url,callback){
        return new Promise(function(resolve,reject){
            var xhr=new XMLHttpRequest();
            xhr.open("GET",url);
            xhr.send(null);
            xhr.onload=function(){
                if(xhr.state===200){
                    resolve(xhr.response);
                }
            }
        })
    }
     
       2)POST方式:
    function GetAjax(url,data){
        return new Promise(function(resolve,reject){
            var xhr=new XMLHttpRequest();
            xhr.open("POST",url);
            xhr.setRequestHeader("Content-Type","application/x-www-from-urlencoded")
            xhr.send(data);
            xhr.onload=function(){
                if(xhr.state===200){
                    resolve(xhr.response);
                }
            }
        })
    }
     

    9、小案例
    案例一:
    <!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>ajax封装问题</title>
    </head>
    <body>
        <button id="btn1">数据一</button>
        <button id="btn2">数据二</button>
        <p class="txt">我是来装载数据的</p>
        <script>
            var otxt=document.querySelector(".txt")
            var oBtn1=document.querySelector("#btn1");
            var oBtn2=document.querySelector("#btn2");
            oBtn1.onclick=function(){
                GetAjax("./json/data1.json",function(res){
                    otxt.innerHTML=res;
                });
            }
            oBtn2.onclick=function(){
                GetAjax("./json/data2.json",function(res){
                    otxt.innerHTML=res;
                });
            }
            function GetAjax(url,callback){
                var xhr=new XMLHttpRequest();
                xhr.open("GET",url);
                xhr.send(null);
                xhr.onload=function(){
                    if(xhr.status===200){
                        callback(xhr.response);
                    }
                }
            }
        </script>
    </body>
    </html>
    演示结果:
        
     
     
     
  • 相关阅读:
    exkmp
    欧拉通路、回路
    你有多久没有看过星星
    trie树模板(统计难题)
    SPFA(热浪)
    codevs1958 刺激
    洛谷1290 欧几里得的游戏
    洛谷1016 旅行家的预算
    Spfa算法模板
    Tyvj2017清北冬令营入学测试
  • 原文地址:https://www.cnblogs.com/liuqinq/p/10028776.html
Copyright © 2011-2022 走看看