实现自己的Ajax函数

122 阅读1分钟

利用原生Ajax,封装一个自己的Ajax函数,实现get和post的功能

html

<!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" />
    <link rel="stylesheet" href="./lib/bootstrap-v4.6.0.css" />
    <title>Document</title>
    <style>
        #addForm {
            width: 600px;
        }
    </style>
</head>

<body>
    <form class="card-body bg-light" id="addForm">
        <!-- 书名 -->
        <div class="input-group mb-3">
            <div class="input-group-prepend">
                <span class="input-group-text">书名</span>
            </div>
            <input type="text" class="form-control" placeholder="请输入图书名称" name="bookname" />
        </div>
        <!-- 作者 -->
        <div class="input-group mb-3">
            <div class="input-group-prepend">
                <span class="input-group-text">作者</span>
            </div>
            <input type="text" class="form-control" placeholder="请输入作者名字" name="author" />
        </div>
        <!-- 出版社 -->
        <div class="input-group mb-3">
            <div class="input-group-prepend">
                <span class="input-group-text">出版社</span>
            </div>
            <input type="text" class="form-control" placeholder="请输入出版社名称" name="publisher" />
        </div>
        <input type="button" value="添加" class="btn btn-dark btnadd" />
    </form>
    <script src="./js/myAjax.js"></script>
    <script>
        let btnadd = document.querySelector('.btnadd')
        let bookname = document.querySelector('[name="bookname"]')
        let author = document.querySelector('[name="author"]')
        let publisher = document.querySelector('[name="publisher"]')

        btnadd.addEventListener('click', function() {
            // get请求
            ajax({
                method: 'get',
                url: 'http://www.itcbc.com:3006/api/getbooks',

                success: function(res) {
                    console.log(res);
                }
            })

            // post请求

		    //FormData类型
            // let form = document.querySelector('form')
            // let fd = new FormData(form)

            // let data = {}
            // fd.forEach(function(value, key) {
            //     data[key] = value
            // })

          
          	//对象类型
            // let data = {
            //     bookname: bookname.value,
            //     author: author.value,
            //     publisher: publisher.value,
            // }

            // ajax({
            //     method: 'post',
            //     url: 'http://www.itcbc.com:3006/api/addbook',
            //     data,
            //     success: function(res) {
            //         console.log(res);
            //     }
            // })
        })
    </script>
</body>

</html>

js

function setObjectToString(obj) {
    // {name:'jack',age:20} ---> name=jack&age=20
    let arr = []
    for (let key in obj) {
        arr.push(key + '=' + obj[key])
    }
    return arr.join('&')
}

//                       对象解构
function ajax({ method, url, params, data, success }) {
    // 创建异步对象
    let xhr = new XMLHttpRequest()

    // 使用异步函数发送请求
    // 请求行
    if (method.toLowerCase() == 'get' && params) {
        url = url + '?' + setObjectToString(params)
    }
    xhr.open(method, url)

    // 请求头
    // 请求体
    // instanceof:判断一个的构造函数是否是某个构造函数,意味着判断对象是否是某个构造函数创建的
    if (data && data instanceof FormData) {
        // 传递的是FormData类型
        xhr.send(data)
    } else if (typeof data == 'object') {
        // 传递的是对象类型
        xhr.setRequestHeader('Content-Type', 'application/json')
        xhr.send(JSON.stringify(data))
    } else if (typeof data == 'string') {
        // 传递的是字符串类型 key=value$key=value
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
        xhr.send(data)
    } else {
        xhr.send()
    }

    xhr.addEventListener('load', function() {
        // 调用用户传入的回调函数,且将后台的响应数据做为参数回传
        success(JSON.parse(xhr.response))
    })
}