AJAX:原生AJAX简介及基本使用

1.AJAX 简介

AJAX 全称为 Asynchronous JavaScript And XML,就是异步的 JS 和 XML。
通过 AJAX 可以在浏览器中向服务器发送异步请求,最大的优势就是:无刷新获取数据
AJAX 不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。


2.XML 简介

XML :可扩展标记语言
XML 被设计用来传输和存储数据。
XML 和 HTML 类似,不同的是 HTML 中都是预定义标签 , 而 XML 中没有预定义标签,都是自定义标签,用来表示一些数据。

比如:

<person>
	 <name>xy</name>
	 <age>21</age>
</person> 

不过现在已被JSON替代。


3. AJAX 的特点

3.1 优点

  1. 可以不需要刷新页面就可以与服务端进行通信
  2. 允许你根据用户事件来更新部分页面内容

3.2 缺点

  1. 没有浏览历史,不能回退
  2. 存在跨域问题
  3. SEO(搜索引擎优化) 不友好,动态创建的数据爬虫爬不到

4. AJAX 的使用

4.1 核心对象

XMLHttpRequest: 核心对象
AJAX的所有操作都是通过该对象进行的

4.2 使用步骤

1.创建 XMLHttpRequest对象

vat xhr=new XMLHttpRequest(); 

2.设置请求信息

   xhr.open(method,url);
   //可以设置请求头,一般不设置
   //url:可通过?&a=100&b=100传递参数

3.发送请求

xhr.send(body) 
//get 请求不传 body 参数,只有 post 

4.接收响应

//xhr.responseXML 接收 xml 格式的响应数据
//xhr.responseText 接收文本格式的响应数据
xhr.onreadystatechange = function (){
//xhr.readyState == 4:判断服务端是否返回了全部结果

if(xhr.readyState == 4){
if(xhr.status >= 200 && xhr.status < 300){
var text = xhr.responseText;
	console.log(text);
	 }
	}
}

延申:
onreadystatechange:由on 、readyState、change组成

1.on:当…的时候
2.readyState:xhr对象中的一个属性,表示状态。有5个取值:0 1 2 3 4

0: 未初始化
1:open方法调用完毕,仍然可以使用 setRequestHeader(),设定 HTTP请求的头信息。
2:send方法调用完毕,并且头信息和状态码已经收到
3:服务端返回了部分结果
4:服务端返回了所有的结果,或者本次接收已经失败了

3.change:改变,表示0-4状态改变


4. 案例(GET 请求)

需求:
通过GET.html向server.js发送GET请求,获取响应体,并显示在div中

分析:
GET.html:通过ajax发送请求
server.js:express框架模拟服务端

代码:
GET.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ajax GET 请求</title>

    <style>
        div {
            width: 100px;
            height: 100px;
            background: pink;
        }
    </style>
</head>

<body>
    <button>发送请求</button>
    <div></div>
    <script>
        let btn = document.querySelector('button');
        let res = document.querySelector('div');
        btn.addEventListener('click', function () {
            // 1.创建xhr对象
            const xhr = new XMLHttpRequest();
            // 2.open
            xhr.open('GET', 'http://localhost:8000/server');
            // 3.发送
            xhr.send();
            // 4.事件绑定 处理服务端返回的结果
            xhr.onreadystatechange = function () {
                // 判断状态是否返回了所有结果
                if (xhr.readyState == 4) {
                    //判断响应状态码 200-300之间
                    if (xhr.status >= 200 && xhr.status < 300) {
                        console.log(xhr.status);//状态码 
                        console.log(xhr.statusText);//状态字符串
                        console.log(xhr.getAllResponseHeaders());//所有响应头
                        console.log(xhr.response);//响应体
                        res.innerHTML = xhr.response;
                    }
                }
            }
        })
    </script>
</body>
</html>

server.js

// 1.引入express
const express = require('express');

// 2.创建应用对象
const app = express();

// 3.创建路由规则(GET方法)
app.get('/server', (request, response) => {
    // request 是对请求报文的封装
    // response 是对响应报文的封装

    // 设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin', '*');
    // 设置响应体
    response.send('hello express');
});

// 4.监听端口启动服务
app.listen(8000, () => {
    console.log('服务已经启动,8000端口监听中...');
})

结果:
显示:
在这里插入图片描述

控制台打印:
在这里插入图片描述
标头:
在这里插入图片描述


5. 案例(POST请求)

需求:
通过POST.html向server.js发送GET请求,获取响应体,并显示在div中

分析:
POST.html:通过ajax发送请求
server.js:express框架模拟服务端

代码:
POST.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ajax GET 请求</title>
    <style>
        div {
            width: 100px;
            height: 100px;
            background: pink;
        }
    </style>
</head>
<body>
    <button>发送请求</button>
    <div></div>
    <script>
        let btn = document.querySelector('button');
        let res = document.querySelector('div');
        btn.addEventListener('click', function () {
            // 1.创建xhr对象
            const xhr = new XMLHttpRequest();
            // 2.open
            xhr.open('POST', 'http://localhost:8000/server');
            // 3.发送(可任意写法)
            xhr.send('a=100&b=100');
            // 4.事件绑定 处理服务端返回的结果
            xhr.onreadystatechange = function () {
                // 判断状态是否返回了所有结果
                if (xhr.readyState == 4) {
                    //判断响应状态码 200-300之间
                    if (xhr.status >= 200 && xhr.status < 300) {
                        console.log(xhr.status);//状态码 
                        console.log(xhr.statusText);//状态字符串
                        console.log(xhr.getAllResponseHeaders());//所有响应头
                        console.log(xhr.response);//响应体
                        res.innerHTML = xhr.response;
                    }
                }
            }
        })
    </script>
</body>
</html>

server.js

// 1.引入express
const express = require('express');

// 2.创建应用对象
const app = express();

// 3.创建路由规则(POST方法)
app.post('/server', (request, response) => {
    // request 是对请求报文的封装
    // response 是对响应报文的封装

    // 设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin', '*');
    // 设置响应体
    response.send('hello express POST');
});

// 4.监听端口启动服务
app.listen(8000, () => {
    console.log('服务已经启动,8000端口监听中...');
})

结果:
显示:
在这里插入图片描述

控制台打印:
在这里插入图片描述

标头:
在这里插入图片描述
请求负载
在这里插入图片描述


6. 解决IE缓存

问题:在一些浏览器中(IE),由于缓存机制的存在,ajax 只会发送的第一次请求,剩余多次请求不会在发送给浏览器而是直接加载缓存中的数据。

解决方式:浏览器的缓存是根据 url 地址来记录的,所以我们只需要修改 url 地址即可避免缓存问题
xhr.open(“get”,"/testAJAX?t="+Date.now())

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值