http + ajax

ajax

一. http 超文本传输协议
二 .在浏览器地址栏键入URL,按下回车之后会经历以下流程:(面试题)
0. 先看本地c盘 hosts里是否配置指定域名(ip)
1.浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2.解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
3.浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,
该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
4.服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
5.释放 TCP连接;
6.浏览器将该 html 文本并显示内容;
三. 请求报文
1.请求行 [请求方式 url地址 协议(1.0/1.1/2.0) ]
2.请求头部 [content-type,cookie]
3.请求体 [数据]
四. 响应文本
状态行 协议 状态码(200,404,304,401) 状态短语
响应头 content-type: 告诉浏览器 给你的内容 怎么去处理
响应体 给浏览器的数据
进程与线程
进程 程序启动的时候 就运行 每个进程都有 独立的代码和数据空间 (资源最小的分配单位)
线程 负责处理任务 调用最小单位
进程 一个人
线程 手 (工作) js引擎是属于单线程
同步 : 按照顺序一步一步的执行
异步 : 不按照顺序执行

ajax 的核心对象是什么? (重点)
XMLHTTPREQUEST 简称 xhr
什么是ajax?
它是一个基于http协议的,与服务器进行通信的技术. 能够实现同步或异步的局部刷新效果
局部刷新?有什么好处?
能够提高用户体验 (能实现 局部刷新)
降低浏览器与服务器的压力(减低吞吐量);

 //1.创建核心对象
        function createXHR() {
            if (window.XMLHttpRequest) {
                return new XMLHttpRequest()
            }
            return new ActiveXObject("Msxml2.XMLHTTP");//ie ms(微软)
        }
        //2.写一个get请求 
        function ajax(url) {
            //1.得到ajax 的核心对象
            var xhr = createXHR();
            //2.准备请求的参数  open(请求方式,地址,同步或异步)
            //同步会造成 阻塞 (假死,卡死)
            xhr.open("get", url, false)  //如果第3个参数,不写默认就是异步 ,false同步
            //3.发送请求
            xhr.send(null);//注意:get请求发送null
            //4.得到数据
            if (xhr.status == 200) { //判断服务器是否ok
                //得到数据
                return xhr.response
            }
        }
        //js单线程
        var res = ajax("http://useker.cn/getUsers");
        console.log(JSON.parse(res));

ajax简单封装

class Utils {
    static createXHR() {
        if (window.XMLHttpRequest) {
            return new XMLHttpRequest()
        }
        return new ActiveXObject('Msxml2.XMLHTTP');//IE6
    }
    static get(url) {
        let xhr = Utils.createXHR();
        xhr.open("get", url, false);//同步
        xhr.send(null);//因为是get请求发送空
        if (xhr.status == 200) {
            return xhr.response;
        }
    }
}

什么是回调函数?
把一个函数当做另外一个函数的参数,在另外一个函数里被执行和传递参数
能做什么?能解决异步.

异步

function createXHR() {
            if (window.XMLHttpRequest) {
                return new XMLHttpRequest()
            }
            return new ActiveXObject('Msxml2.XMLHTTP');//IE6
        }
        function ajax(url, callback) {
            var xhr = createXHR();
            //准备参数 
            xhr.open("get", url);//不写第3个参数也是异步,true也是异步,false同步
            xhr.send(null);//因为是get请求所以send发送null
            //注意:异步需要同步事件帮我们处理 事件的机制
            //这个事件,自动触发 (xhr读取数据时,就触发)会触发3次,状态 2 3 4
            xhr.onreadystatechange = function () {
                if (xhr.status == 200) {//http的状态码
                    //  事件触发的状态,默认的值是0
                    if (xhr.readyState == 4) { //完全接受了数据
                        //  xhr.response;
                        callback(xhr.response)
                    }
                }
            }
        }
        //调用ajax
        ajax("http://useker.cn/person", function (res) {
            console.log(res);
        });

get 请求是通过url带参数
key value
{name:abc123}
http://www.baidu.com?wd=abc&&name=abc123&pwd=123

ajax全套

class Utils {
    //处理参数,把对象拼接成为参数
    static getParams(o) {
        let str = "";
        for (let key in o) {
            if (o.hasOwnProperty(key)) {
                str += key + "=" + o[key] + "&";
            }
        }
        return str;
    }
    static createXHR() {
        if (window.XMLHttpRequest) {
            return new XMLHttpRequest()
        }
        return new ActiveXObject('Msxml2.XMLHTTP');//IE6
    }
    //url 请求的路径
    //data 携带的数据
    //callback 异步的回调函数
    static get(url, data, callback) {
        let xhr = this.createXHR();
        xhr.open("get", url + "?" + Utils.getParams(data));
        xhr.send(null);
        xhr.onreadystatechange = function () {
            if (xhr.status == 200 && xhr.readyState == 4) {
                if (callback) {
                    callback(xhr.response);
                }
            }
        }
    }
}

分页 面向过程

<script>
        var pageSize = 20;
        var pageIndex = 1
        var dataCount = 0;
        var oTab = document.querySelector("#tab");
        //页面加载就要显示数据
        //http://useker.cn/getUsersPage?pageSize=5&pageIndex=2
        Utils.get("http://useker.cn/getUsersPage", {
            pageSize,//一页显示5要
            pageIndex //当前是第几页
        }, function (res) {
            console.log(res);
            let { data, count } = JSON.parse(res);
            dataCount = count;//把得到的总条数赋给 全局变量 dataCount
            var strHtml = ``
            data.forEach(item => {
                strHtml += `
                  <tr>
                    <td>${item.uname}</td>
                    <td>${item.upwd}</td>
                    <td>${item.uage}</td>
                    <td>${item.uphone}</td>
                    <td>${item.realname}</td>
                    <td>${moment(item.datetime).format("YYYY-MM-DD HH:mm:SS")}</td>
                 </tr> `
            });
            document.querySelector("#tab").innerHTML = strHtml;
        })
        var oBtnNext = document.querySelector("#next");
        oBtnNext.onclick = function () {
            // 11  5 
            var maxPage = Math.ceil(dataCount / pageSize)
            // 236 每一页显示20条 
            pageIndex++;//下一页
            if (pageIndex >= maxPage) {
                pageIndex = maxPage;
                alert("已经是最后一页")
            }
            Utils.get("http://useker.cn/getUsersPage",
                {
                    pageSize,//一页显示5要
                    pageIndex //当前是第几页
                }, function (res) {
                    console.log(res);
                    let { data } = JSON.parse(res);

                    var strHtml = ``
                    data.forEach(item => {
                        strHtml += `
                  <tr>
                    <td>${item.uname}</td>
                    <td>${item.upwd}</td>
                    <td>${item.uage}</td>
                    <td>${item.uphone}</td>
                    <td>${item.realname}</td>
                    <td>${moment(item.datetime).format("YYYY-MM-DD HH:mm:SS")}</td>
                 </tr> `
                    });
                    document.querySelector("#tab").innerHTML = strHtml;
                })
        }
        //上一页
        var oPrev = document.querySelector("#prev");
        oPrev.onclick = function () {
            pageIndex--;
            if (pageIndex <=0) {
                pageIndex = 1;
                alert('以是第一页')
            }

            Utils.get("http://useker.cn/getUsersPage",
                {
                    pageSize,//一页显示5要
                    pageIndex //当前是第几页
                }, function (res) {
                    console.log(res);
                    let { data } = JSON.parse(res);

                    var strHtml = ``
                    data.forEach(item => {
                        strHtml += `
                  <tr>
                    <td>${item.uname}</td>
                    <td>${item.upwd}</td>
                    <td>${item.uage}</td>
                    <td>${item.uphone}</td>
                    <td>${item.realname}</td>
                    <td>${moment(item.datetime).format("YYYY-MM-DD HH:mm:SS")}</td>
                 </tr> `
                    });
                    document.querySelector("#tab").innerHTML = strHtml;
                })
        }
    </script>

分列 类方法

<script>
        class TabPage {
            constructor(settings = {}) {
                this.settings = Object.assign({ pageSize: 5, pageIndex: 1 }, settings);
                this.pageSize = this.settings.pageSize;//默认1页显示5条
                this.pageIndex = this.settings.pageIndex;//默认第1页
                this.el = document.querySelector(this.settings.el);
                this.data = [];//数据
                this.maxPageIndex = 0;
                //实例化后,就立马请求ajax
                Utils.get("http://useker.cn/getUsers", {}, (res) => {
                    let { data } = JSON.parse(res) // {msg:'xxx',data:[xxx],count:236}
                    this.data = data;
                    //计算出最大页码  一共有多少页
                    this.maxPageIndex = Math.ceil(this.data.length / this.pageSize);
                    //渲染数据
                    var newArr = this.data.slice((this.pageIndex - 1) * this.pageSize, this.pageIndex * this.pageSize);
                    this.render(newArr);
                })
            }
            //下一页
            next() {
                this.pageIndex++;
                if (this.pageIndex >= this.maxPageIndex) {
                    this.pageIndex = this.maxPageIndex;
                }
                console.log( this.maxPageIndex);
                //               0   ,5
                //               5   ,10  
                var newArr = this.data.slice((this.pageIndex - 1) * this.pageSize, this.pageIndex * this.pageSize);
                this.render(newArr);
            }
            //上一页
            prev() {
                this.pageIndex--;
                if (this.pageIndex <= 0) {
                    this.pageIndex = 1;
                }
                if (this.pageIndex >= this.maxPageIndex) {
                    this.pageIndex = this.maxPageIndex;
                }
                //               0   ,5
                //               5   ,10  
                var newArr = this.data.slice((this.pageIndex - 1) * this.pageSize, this.pageIndex * this.pageSize);
                this.render(newArr);
            }
            //渲染
            render(list) {
                if (!Array.isArray(list)) {//list必须是一个数组
                    return;
                }
                let strHtml = ``;
                list.forEach(item => {
                    strHtml += `
                        <tr>
                            <td>${item.uname}</td>
                            <td>${item.upwd}</td>
                            <td>${item.uage}</td>
                            <td>${item.uphone}</td>
                            <td>${item.realname}</td>
                            <td>${moment(item.datetime).format("YYYY-MM-DD HH:mm:SS")}</td>
                        </tr>
                    `;
                });
                this.el.innerHTML = strHtml;
            }
        }

        var oTabPage = new TabPage({
            el: "#tab",
            pageSize:50
        })
        var oNext = document.querySelector("#next");
        oNext.onclick = function () {
            oTabPage.next()
        }
        var oPrev = document.querySelector("#prev");
        oPrev.onclick = function () {
            oTabPage.prev()
        }
    </script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • AJAX 复习1.什么是ajax?与服务器进行通讯的一种技术,能够实现同步或异步的局部刷新2.ajax的核心对象是...
    sskingfly阅读 163评论 0 0
  • 1.行级元素有哪些?块级元素有哪些?行级元素如何转换成块级元素? block元素的特点: 1.总在新行开始,2.高...
    我的天气很好啦阅读 1,541评论 2 9
  • Cookie cookie 也叫 HTTPCookie,是客户端与服务器端进行会话(session)使用的一个能够...
    sskingfly阅读 349评论 0 0
  • js新特性之网络编程 1.h5新增存储方案 <!DOCTYPE html> 18-H5新增存...
    煤球快到碗里来阅读 393评论 0 0
  • 函数 JS函数的概念 函数就是把特定功能的代码抽取出来,使之成为程序中的一个独立实体正如函数的概念, 我们可以根据...
    sskingfly阅读 401评论 0 0