美文网首页
丸子学JS(学习1小时 - AJAX)

丸子学JS(学习1小时 - AJAX)

作者: 丸子小姐__不懂爱 | 来源:发表于2023-11-26 17:08 被阅读0次

Ajax 是干什么的

Ajax(Asynchronous JavaScript And XML)是2005年新出现的技术,它的出现是为了解决这样一个场景:整个页面中,只有一小部分的数据需要进行更新,按照传统的前后端交互,我们需要向服务器请求该网页的所有数据,然后再在客户端重新渲染,这无疑是非常低效的操作。因此,Ajax就可以做到只向服务器请求我们想要的那一小部分数据,而不用请求全部数据,进而在刷新整个页面的前提下更新那部分的数据

Ajax的优缺点

1)优点

  1. 浏览器默认支持(一般浏览器都是支持JavaScript的)
  2. 提高用户体验(不需要刷新整个页面,而只需要局部刷新)
  3. 提高页面的性能(只需要请求部分数据,所以数据量就明显下降了)
    2)缺点
  4. 破坏了浏览器的前进和后退功能(Ajax不会改变网页URL,因此不会在浏览器记录前后页面)
  5. 对搜索引擎的支持较弱(搜索引擎无法检测到JS引起的数据变化)

Ajax的使用

Ajax的基本流程: 创建XHR对象 => 发送数据 => 接收数据
1)状态码

2)xhr的使用
创建一个xhr的实例

let xhr = new XMLHttpRequest()  

创建一个请求体

xhr.open('get', 'example.php', 'true');

发送

xhr.send();

获取服务端返回的数据

xhr.onreadystatechange = function() {
    console.log(xhr.readyState);
}
  1. 发送get请求
    get请求所携带的数据是明文的,大小只有4k左右,而且它是写在URL的 ? 后面的
let xhr = new XMLHttpRequest();
xhr.open('get', 'example.php?query=2&count=10')
xhr.send()
  1. 发送post请求
    发送post请求的数据是放在请求体中的,因此这里需要调用 xhr 对象上的 setRequestHeader()方法来模仿表单提交时的内容类型
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')

send() 方法接收的一个参数是请求主体发送的数据,所以我们的post请求要发送的数据就要作为该方法的参数

xhr.send('query=4&em=0')

封装$.ajax方法

const $ = {
    createXHR: function() {
        if(window.XMLHttpRequest) {
            return new XMLHttpRequest();
        }else {
            return new ActiveXObject();
        }
    },
    ajax: function(params){
        // 初始化
        let type = params.type ? params.type.toLowerCase() : 'get';
        let url = params.url;
        let data = params.data ? params.data : {};
        let isAsync = params.isAsync ? params.isAsync : 'true';
        let dataType = params.dataType.toLowerCase();
        let xhr = this.createXHR();
        // 拼接字符串
        let str = '';
        Object.keys(data).forEach(key => {
            str += `${key}=${data[key]}&`;
        })
        // 去掉尾部的&
        str = str.slice(0, -1);
        // 如果type = get 则吧携带参数直接拼到 url后面
        if(type === 'get') {
            url += `?${str}`;
        }
        // 返回一个promise对象
        return new Promise((resolve, reject) => {
            // 创建请求
            xhr.open(type, url, isAsync);

            if(type === 'post') {
                xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                xhr.send(str);
            }else {
                xhr.send();
            }

            xhr.onreadystatechange = function() {
                if(xhr.readyState === 4) {
                    if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) {
                        let res = dataType === 'json' ? JSON.parse(xhr.responseText) : xhr.responseText;
                        resolve(res)
                    }else {
                        reject(xhr.status)
                    }
                }
            }
        })
    }
}

相关文章

网友评论

      本文标题:丸子学JS(学习1小时 - AJAX)

      本文链接:https://www.haomeiwen.com/subject/snrawdtx.html