前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一篇,让你会写原生ajax

一篇,让你会写原生ajax

作者头像
阿超
发布2022-08-16 16:48:22
2140
发布2022-08-16 16:48:22
举报
文章被收录于专栏:快乐阿超

在这个社会转型期,最大的悲剧不是坏人的嚣张,而是好人的过度沉默。——马丁·路德·金

非常简单啦~

大家可以拿去任意定制,比如请求方式使用参数传入、指定参数类型、调用时控制是否同步等

代码语言:javascript
复制
var Ajax = {
    /**
     * get参数格式化,转换对象成url方式
     * @param data 对象 转换前: {"username":"ruben","password":"achao"}
     * @returns {string} 转换后: username=ruben&password=achao
     */
    dataFormat: function (data) {
        if (data == null || "" === data) {
            return "";
        }
        return "?" + Object.keys(data).map(function (key) {
            return encodeURIComponent(key) + "=" + encodeURIComponent(data[key]);
        }).join("&");
    },
    /**
     *
     * @param url 接口地址
     * @param data 参数 注意请传入对象,因为要转换
     * @param fn 定义在外面,可以执行相关逻辑
     * 例:
     * //在需要使用的页面
     * //引入js文件后,在那个页面这样调用
     * //声明处理对象
     * var fn = {
                success: function (data) {
                //成功逻辑
                    alert(data.msg);
                },
                error: function (data) {
                //失败逻辑
                    console.log(data);
                }
            },
     //调用
     Ajax.get("/user/say", {word: data.msg}, this.say);
     *在后端接收
     * @RequestParam String word
     */
    get: function (url, data, fn) {
        // XMLHttpRequest对象用于在后台与服务器交换数据
        var xhr = new XMLHttpRequest();
        //这里第三个参数async为false,这个是是否开启同步(上一个请求回来以后再请求下一个这种)
        xhr.open('GET', url + this.dataFormat(data), false);
        // 添加请求头,例如token等
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xhr.onreadystatechange = function () {
            // readyState == 4说明请求已完成
            if (xhr.readyState == 4) {
                if (xhr.status == 200 || xhr.status == 304) {
                    var responseText = xhr.responseText
                    var response = JSON.parse(responseText);
                    //处理逻辑
                    //执行判断(这里省略,实际应用逻辑和返回结果进行判断)
                    //判断如果成功,调用传进来的对象的success方法
                    //fn.success(response)
                    //判断如果失败
                    //fn.error(response)
                }
            }
        }
        xhr.send();
    },
    /**
     *
     * @param url 接口地址
     * @param data 参数 传入JSON
     * @param fn 定义在外面,可以执行相关逻辑
     * 例:
     * //在需要使用的页面
     * //引入js文件后,在那个页面这样调用
     * //声明处理对象
     * var fn = {
                success: function (data) {
                //成功逻辑
                    alert(data.msg);
                },
                error: function (data) {
                //失败逻辑
                    console.log(data);
                }
            },
     //调用
     Ajax.post("/user/login", JSON.stringify(user), fn);
     * 后端接收
     * @RequestBody User user
     */
    post: function (url, data, fn) {
        var xhr = new XMLHttpRequest();
        //这里第三个参数async为false,这个是是否开启同步(上一个请求回来以后再请求下一个这种)
        xhr.open('POST', url, false);
        // 添加请求头,例如token等
        xhr.setRequestHeader('Content-Type', 'application/json');
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4) {
                if (xhr.status == 200 || xhr.status == 304) {
                    var responseText = xhr.responseText
                    var response = JSON.parse(responseText);
                    //处理逻辑
                    //执行判断(这里省略,实际应用逻辑和返回结果进行判断)
                    //判断如果成功,调用传进来的对象的success方法
                    //fn.success(response)
                    //判断如果失败
                    //fn.error(response)
                }
            }
        }
        xhr.send(data);
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档