• ajax封装


    区别一般 http 请求与 ajax 请求

    1. ajax 请求是一种特别的 http 请求

    2. 对服务器端来说, 没有任何区别, 区别在浏览器端

    3. 浏览器端发请求: 只有 XHR 或 fetch 发出的才是 ajax 请求, 其它所有的都是 非 ajax 请求

    4. 浏览器端接收到响应

      (1) 一般请求: 浏览器一般会直接显示响应体数据, 也就是我们常说的刷新 / 跳转页面

      (2) ajax 请求: 浏览器不会对界面进行任何更新操作, 只是调用监视的回调函数并传入响应相关数据

    1. XMLHttpRequest(): 创建 XHR 对象的构造函数
    2. status: 响应状态码值, 比如 200,404 3. statusText: 响应状态文本
    4. readyState: 标识请求状态的只读属性 0: 初始 1: open()之后 2: send()之后 3: 请求中 4: 请求完成
    5. onreadystatechange: 绑定 readyState 改变的监听
    6. responseType: 指定响应数据类型, 如果是'json', 得到响应后自动解析响应体数据
    7. response: 响应体数据, 类型取决于 responseType 的指定
    8. timeout: 指定请求超时时间, 默认为 0 代表没有限制
    9. ontimeout: 绑定超时的监听
    10. onerror: 绑定请求网络错误的监听
    11. open(): 初始化一个请求, 参数为:(method,url[,async])
    12. send(data): 发送请求
    13. abort(): 中断请求
    14. getResponseHeader(name): 获取指定名称的响应头值
    15. getAllResponseHeaders(): 获取所有响应头组成的字符串
    16. setRequestHeader(name,value): 设置请求头

    封装Ajax

    function myAjax(opt) {
        //默认参数
        opt = opt || {};
        opt.method = opt.method || 'GET';
        opt.url = opt.url || '';
        opt.async = opt.async || true;
        opt.data = opt.data || null;
        opt.dataType = opt.dataType || 'JSON';
        opt.success = opt.success || function () { };
    
        var xmlHttp = null;
        if (XMLHttpRequest) {
            xmlHttp = new XMLHttpRequest();
        } else {
            xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
        }
    
        var params = [];
        for (var key in opt.data){
            params.push(key + '=' + opt.data[key]);
        }
        var postData = params.join('&');
        if (opt.dataType === 'JSONP') {
            creatScript(opt.url, postData);
        } else {
            if (opt.method.toUpperCase() === 'POST') {
                xmlHttp.open(opt.method, opt.url, opt.async);
                xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
                xmlHttp.send(postData);
            } else if (opt.method.toUpperCase() === 'GET') {
                xmlHttp.open(opt.method, opt.url + '?' + postData, opt.async);
                xmlHttp.send(null);
            }
            xmlHttp.onreadystatechange = function () {
                if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                    if (opt.dataType === 'JSON') {
                        opt.success(xmlHttp.response);
                    }
                }
            }
        }
    
    }

    ajax封装

    function obj2str(data) {
        /*
        {
            "userName":"lnj",
            "userPwd":"123456",
            "t":"3712i9471329876498132"
        }
        */
        data = data || {}; // 如果没有传参, 为了添加随机因子,必须自己创建一个对象
        data.t = new Date().getTime();
        var res = [];
        for(var key in data){
            // 在URL中是不可以出现中文的, 如果出现了中文需要转码
            // 可以调用encodeURIComponent方法
            // URL中只可以出现字母/数字/下划线/ASCII码
            res.push(encodeURIComponent(key)+"="+encodeURIComponent(data[key])); // [userName=lnj, userPwd=123456];
        }
        return res.join("&"); // userName=lnj&userPwd=123456
    }
    function ajax(option) {
        // 0.将对象转换为字符串
        var str = obj2str(option.data); // key=value&key=value;
        // 1.创建一个异步对象
        var xmlhttp, timer;
        if (window.XMLHttpRequest)
        {// code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        }
        else
        {// code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        // 2.设置请求方式和请求地址
        /*
        method:请求的类型;GET 或 POST
        url:文件在服务器上的位置
        async:true(异步)或 false(同步)
        */
        if(option.type.toLowerCase() === "get"){
            xmlhttp.open(option.type, option.url+"?"+str, true);
            // 3.发送请求
            xmlhttp.send();
        }else{
            xmlhttp.open(option.type, option.url,true);
            // 注意点: 以下代码必须放到open和send之间
            xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            xmlhttp.send(str);
        }
    
        // 4.监听状态的变化
        xmlhttp.onreadystatechange = function (ev2) {
            /*
            0: 请求未初始化
            1: 服务器连接已建立
            2: 请求已接收
            3: 请求处理中
            4: 请求已完成,且响应已就绪
            */
            if(xmlhttp.readyState === 4){
                clearInterval(timer);
                // 判断是否请求成功
                if(xmlhttp.status >= 200 && xmlhttp.status < 300 ||
                    xmlhttp.status === 304){
                    // 5.处理返回的结果
                    // console.log("接收到服务器返回的数据");
                    option.success(xmlhttp);
                }else{
                    // console.log("没有接收到服务器返回的数据");
                    option.error(xmlhttp);
                }
            }
        }
        // 判断外界是否传入了超时时间
        if(option.timeout){
            timer = setInterval(function () {
                console.log("中断请求");
                xmlhttp.abort();
                clearInterval(timer);
            }, option.timeout);
        }
    }

  • 相关阅读:
    《第一行代码》学习笔记18-广播接收器Broadcast_Receiver(1)
    《第一行代码》学习笔记17-碎片Fragment(2)
    《第一行代码》学习笔记16-碎片Fragment(1)
    《第一行代码》学习笔记15-UI(4)
    《第一行代码》学习笔记14-UI(3)
    《第一行代码》学习笔记13-UI(2)
    《第一行代码》学习笔记12-UI(1)
    ios-NSMutableAttributedString 更改文本字符串颜色、大小
    ios-实现项目在开发、测试、正式环境快速部署
    ios-滚动导航条页面
  • 原文地址:https://www.cnblogs.com/zzxuan/p/9372672.html
Copyright © 2020-2023  润新知