AJAX,这一篇就够了

简介: 学会它的基础,就理解了它的核心,其他的封装库,也就拿来就行了

Ajax

Ajax 技术是 javascript 中最重要的一个组成部分,不会 Ajax,你写的就是一个死页面。Ajax 是与后台来连接数据的,你 Ajax 玩得 6,在以后的实际工作中,你是有一定话语权的。

Ajax 是什么?

Ajax 即 “Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互网页应用的网页开发技术(用来向后台数据库请求获取数据的技术)。

传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页页面。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

Ajax 除了解决局部更新渲染页面的问题,也解决了前后端分离的问题。

前后端分离的必要性

用户的计算机中无法存储大量的数据,因此就需要将数据存储在后台数据库中,前端页面中需要使用数据的时候,就向后台数据库发送请求获取数据进而渲染数据显示页面

示例如下

image.png

分三步

  1. 发请求

  2. 后台做响应

  3. 前端接到数据做渲染

原生 Ajax

安装本地服务器集成环境

使用 wampserver 集成服务器

注意:选择安装路径必须使用纯英文路径

Wamp 的使用

  1. 启动wamp软件(小图标变绿,启动成功)

  2. 在浏览器地址栏输入 127.0.0.1(本地服务器的 ip 地址)

  3. 如果想使用wamp运行自己的代码,需要将要运行的代码存放进wamp安装目录下的www文件夹中

  4. 存入之后在127.0.0.1地址对应的页面中即可打开文件

  5. 在wamp中打开的页面实际上就是在使用服务器环境打开页面

Ajax 数据交互过程

具体过程

  1. 创建对象
let ajax = new XMLHttpRequest()
  1. 建立前后端连接
ajax.open('请求方式',url地址,是否异步)
  1. 发送请求
ajax.send()
  1. 监听通信状态码改变

什么叫通信状态码 ?

1)通信状态码是用来记录数据交互状态

a. 0: 表示 ajax 的对象还没有创建出来

b. 1: ajax 对象调用了 open,建立了前后端之间的连接

c. 2: ajax 对象调用了 send,发送了请求

d. 3: 后台服务器解析请求,分析请求中需要的数据

e. 4: 后台服务器将数据响应给前端

2)如果通信状态码为 4,证明响应完成,我们就可以在前端获取响应数据了

ajax.onreadystatechange = function() {
   
   
    if(ajax.readyState == 4){
   
   
        console.log(ajax.responseText)
    }
}
  1. 监测请求和响应过程中是否出问题

我们通过响应状态码来监测这个状态

什么是响应状态码 ?

1) 响应状态码是用来记录数据交互过程中是否出问题的标识

a. 200: 请求响应成功,数据来源于后台数据库

b. 304: 请求响应成功,数据来源于本地缓存

c. 403: 请求响应失败,没有权限访问

d. 404: 请求响应失败,访问地址有误

e. 500及以上: 后端服务器问题

2)区分 200 和 304

200 请求响应成功,它获得的数据是来源于后台数据库的

304 请求响应成功,它获得的数据是来源于本地缓存的,也就是说这个数据咱已经请求过一次了,本地已经将其缓存下来了,本地缓存的目的就在于避免再重新向后台数据库进行一个新的请求,比较节省时间,提高响应速度。

ajax.onreadystatechange = function() {
   
   
    if(ajax.readyState == 4){
   
   
        if(ajax.status == 200 || ajax.status == 304){
   
   
            console.log(ajax.responseText)
        }
    }
}

完整代码示例

/*发请求 可以类似于打电话: */ 

//1. 装电话 安装电话的过程其实就是创建这个对象
// javascript 中有一个内置对象专门用来处理ajax数据交互,该对象是: XMLHttpRequest

let ajax = new XMLHttpRequest();

//2. 连电话线 连电话线的过程其实就是建立前端和后台之间的连接
// 建立连接的方法是 XMLHttpRequest对象 的一个方法 send

ajax.open('get','./data.txt',true);

//3. 打电话 打电话的过程其实就是向后台数据库发送请求
// 发送请求的方法是 XMLHttpRequest对象 的一个方法 send

ajax.send();

/*
* 当电话打通后,服务器会自动地解析请求中需要的数据,并发送数据
* 前端接下来需要监听数据是否接受到,如果到了,就可以开始使用数据进行渲染
*/ 

//4. 监测数据 在 XMLHttpRequest对象 有一个 onreadystatechange事件
// onreadystatechange事件可以监测数据响应到什么程度
// on readystate(通信状态码) change(改变)
// 在数据交互的过程中 每当通信状态码改变的时候 就会触发这个事件

ajax.onreadystatechange = function(){
   
   
    //如果通信状态码为 4 就获取数据
    //XMLHttpRequest对象的readyState属性就是通信状态码
    if(ajax.readyState == 4) {
   
   
        //响应数据就是XMLHttpRequest对象的responseRequest属性
        //还需监测请求响应过程中是否出问题
        // 通过响应状态码 state 来监测
        if(ajax.state == 200 || ajax.state == 304) {
   
   
            console.log(ajax.responseRequest)
        }
    }
}

ajax 请求方式之 get 与 post

get 方式

使用 get 请求方式时,我们可以将要提交的数据放置于url地址后面进行提交。

url?键名1=键值&键名2=键值&键名3=键值......

代码示例

    let ajax = new XMLHttpRequest();
    ajax.open(' get ', ' ./data.txtEname=gd&age=18&sex=boy ', true);
    ajax.send();
    ajax.onreadystatechange = function () {
   
   
        if (ajax.readyState == 4) {
   
   
            if (ajax.status == 200 || ajax.status == 304) {
   
   
                console.log(ajax.responseText)
            }
        }
    }

弊端

安全性不高,因为用户提交的数据都会显示在地址栏中,因此 get 不适用于登录注册页面。

提交数据的量很小,大概只有 4kb 左右,不适用于大量数据的提交。

优点

传输数据的速度较快

post 方式

提交数据的方式:将要提交额数据作为 send 方法的参数传入

ajax.send('键名1=键值&键名2=键值&键名3=键值...')

注意

post 方式发送请求需要设置请求头(请求报文的一部分)

那么什么是请求报文?

就是发送的请求实际上是一个已经打包好的信息,然后这个包发送过去。

请求报文中包含三部分内容 : 请求命令行 请求头 请求主体

ajax.setRequestHeader('Content-tepe', 'application/x-www-form-urlencoded');

优点

安全性好

提交的数据大小大概有 20Mb

代码示例

    let ajax = new XMLHttpRequest();
    ajax.open('post', './data.txt', true);
    // post 请求需要在 open 之后,send 之前,设置请求头
    ajax.setRequestHeader('Content-tepe', 'application/x-www-form-urlencoded');
    ajax.send('name=gd&age=18&sex=boy');
    ajax.onreadystatechange = function () {
   
   
        if (ajax.readyState == 4) {
   
   
            if (ajax.status == 200 || ajax.status == 304) {
   
   
                console.log(ajax.responseText)
            }
        }
    }

封装一个 Ajax 方法

封装函数步骤

  1. 写入主体代码

  2. 提出不确定的数据作为参数

  • 请求方式和提交数据的的方式不确定
  • url 地址不确定
  • 提交的数据不确定
  1. 将参数代入函数中

  2. 调用测试

代码示例

    let ajax = function (url,method,data,fn) {
   
   
        let xml = new XMLHttpRequest();
        // 判断 
        if(method =='get'){
   
   
            xml.open(method,url+'?'+data, true);
        }else if(method =='post'){
   
   
            xml.open(method,url,true);
            xml.setRequestHeader('Content-tepe', 'application/x-www-form-urlencoded');
            xml.send('name=gd&age=18&sex=boy');
        }
        // 获取响应数据
        xml.onreadystatechange = function () {
   
   
            if (xml.readyState == 4) {
   
   
                if (xml.status == 200 || xml.status == 304) {
   
   
                    // 让外界能够拿到响应数据 使用回调函数来实现
                    // 如果响应数据成功 就调传用入的回调函数 fn
                    fn(xhr.responseText)
                }
            } 
        }
    }
    ajax('data.txt','get','',function(res){
   
   
        console.log(res)
    })

Ajax 操作数组和json数据

操作数组

目录文件夹

image.png

ajax.js 插件

let ajax = function (url, method, data, fn) {
   
   
    let xml = new XMLHttpRequest();
    // 判断 
    if (method == 'get') {
   
   
        xml.open(method, url + '?' + data, true);
    } else if (method == 'post') {
   
   
        xml.open(method, url, true);
        xml.setRequestHeader('Content-tepe', 'application/x-www-form-urlencoded');
        xml.send('name=gd&age=18&sex=boy');
    }
    // 获取响应数据
    xml.onreadystatechange = function () {
   
   
        if (xml.readyState == 4) {
   
   
            if (xml.status == 200 || xml.status == 304) {
   
   
                // 让外界能够拿到响应数据 使用回调函数来实现
                // 如果响应数据成功 就调传用入的回调函数 fn
                fn(xhr.responseText)
            }
        }
    }
}

引用插件

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- 引入封装的 ajax -->
    <script src="./ajax.js"></script>
    <script>
        ajax('./data1.txt', 'post', true, function (res) {
    
    
            console.log(res, typeof res)
        })
    </script>
</body>

</html>
---控制台---
[1,2,3,4,5,6] string

原生JavaScript通过ajax请求的数据返回的结果为字符串格式

也即 [1,2,3,4,5] 返回的结果为 "[1,2,3,4,5]"

eval() 方法: eval() 函数可计算某个字符串,并执行其中的 JavaScript 代码,可以将字符串数组转换为正则的js数组数据类型数据。

let res1 = eval(res)
console.log(res1)
---控制台---
Array(6) [1,2,3,4,5,6]

操作 Json 数据

Json 的书写规则

  • Json 文件中只能写一个数据

  • Json 中不可以写注释

  • Json 中只能使用双引号,不能使用单引号

  • Json 数据不论数组还是对象,最后一个数组项后属性后面都不能加逗号

  • Json 对象的属性名必须要是双引号

所以采用以下两种方法,来存多个数据

  1. Json 数组

代码示例

[
    "123",
    "456"
]
  1. Json 对象
{
   
   
    "name": "Alian",
    "age": 18
}

Json 文件

{
   
   
    "name": "Alian",
    "age": 18
}

ajax.js 插件

let ajax = function (url, method, data, fn) {
   
   
    let xml = new XMLHttpRequest();
    // 判断 
    if (method == 'get') {
   
   
        xml.open(method, url + '?' + data, true);
    } else if (method == 'post') {
   
   
        xml.open(method, url, true);
        xml.setRequestHeader('Content-tepe', 'application/x-www-form-urlencoded');
        xml.send('name=gd&age=18&sex=boy');
    }
    // 获取响应数据
    xml.onreadystatechange = function () {
   
   
        if (xml.readyState == 4) {
   
   
            if (xml.status == 200 || xml.status == 304) {
   
   
                // 让外界能够拿到响应数据 使用回调函数来实现
                // 如果响应数据成功 就调传用入的回调函数 fn
                fn(xhr.responseText)
            }
        }
    }
}

引用插件

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- 引入封装的 ajax -->
    <script src="./ajax.js"></script>
    <script>
        ajax('./data.json', 'post', function (res) {
   
   
            console.log(res,typeof res);
        })
    </script>
</body>

</html>
---控制台---
{
    "name": "Alian",
    "age": 18
}

string

通过控制台的打印我们可以看到,返回的数据仍然是字符串。

json 数据可以使用 JSON.parse(json数据) 方法将json数据转换为js的对象和数组。

ajax('./data.json','post','',function(res) {
   
   
     console.log(res, typeof res);
     console.log(JSON.parse(res));
})

谢谢款待

目录
相关文章
|
JavaScript
Ant designe vue中有关默认组件引入不生效的问题;
Ant designe vue中有关默认组件引入不生效的问题;
364 0
|
安全 网络安全
Metasploit Pro 4.20.0安装与使用
Metasploit Pro 4.20.0安装与使用
1179 0
Metasploit Pro 4.20.0安装与使用
|
JavaScript 前端开发
JS之url进行编码和解码(三种方式)
JS之url进行编码和解码(三种方式)
20562 2
|
12月前
|
搜索推荐 算法 数据挖掘
用小红书电商 API 实现小红书店铺商品用户画像精准构建
在社交电商时代,小红书凭借海量用户与商品数据,助力店铺构建精准用户画像,实现个性化推荐与高效运营。本文详解如何通过小红书电商 API 获取用户行为、交易与属性数据,结合算法模型完成数据清洗、特征提取与用户聚类,提升转化率与用户粘性。内容涵盖 API 调用示例、特征工程、模型构建及实施建议,帮助开发者系统化落地用户画像方案,驱动业务增长。
|
存储 JSON 前端开发
JSON与现代Web开发:数据交互的最佳选择
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也便于机器解析和生成。它以文本格式存储数据,常用于Web应用中的数据传输,尤其是在客户端和服务器之间。
1415 1
|
存储 弹性计算 运维
深度评测——大模型时代的智能BI—Quick BI
作为一名运维工程师,我近期深度体验了Quick BI,从部署、监控、成本优化、安全合规等方面分享评测报告。其弹性伸缩功能可节省人工干预成本,全链路日志追踪大幅缩短故障排查时间,冷数据归档降低存储成本。但目前存在伸缩策略颗粒度粗、日志分析工具不足等问题。总体而言,Quick BI适合中大型企业构建高效稳定的BI平台,尤其在运维成本控制和故障响应效率上有显著优势。
660 17
|
前端开发 JavaScript
如何利用 CSS3 动画实现元素的淡入淡出效果?
在上述代码中,定义了一个名为 `fade-in` 的CSS类,其初始透明度为0,并设置了淡入的过渡效果。当通过JavaScript为元素添加 `active` 类时,元素的透明度变为1,实现淡入效果;当再次点击按钮移除 `active` 类时,元素又会逐渐淡出。通过这种方式,可以根据用户的操作灵活地控制元素的淡入淡出效果。
2056 60
|
缓存 前端开发 JavaScript
JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式
本文深入解析了JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式(Hash路由和History路由)、优点及挑战,并通过实际案例分析,帮助开发者更好地理解和应用这一关键技术,提升用户体验。
872 1
|
Java 开发者
javafx jlink 遇到的非模块化的依赖打包报错“模块异常”的问题和处理
【9月更文挑战第18天】在使用JavaFX的jlink进行应用打包时,非模块化依赖可能导致“模块异常”报错。此文档详细分析了该问题的原因,并提供了四种解决方案:模块化依赖、自动模块转换、手动创建模块描述符及检查模块依赖关系。通过这些方法,可以有效解决此类问题,提高项目的可维护性和扩展性。建议开发者优先选用模块化设计。
1530 1
|
数据采集 Linux 网络安全
python 爬虫遇到的aiohttp证书错误解决办法
python 爬虫遇到的aiohttp证书错误解决办法
1229 0