【Java 进阶篇】Ajax 实现——原生JS方式

大家好,欢迎来到这篇关于原生 JavaScript 中使用 Ajax 实现的博客!在前端开发中,我们经常需要与服务器进行数据交互,而 Ajax(Asynchronous JavaScript and XML)是一种用于创建异步请求的技术,它可以使我们在不刷新整个页面的情况下更新部分页面内容。在这篇文章中,我们将深入研究原生 JavaScript 如何使用 Ajax,以及一些相关的基础概念。
什么是 Ajax?
Ajax 是一种用于创建异步请求的技术,允许在不刷新整个页面的情况下向服务器发送和接收数据。这使得我们能够动态更新页面的部分内容,提高用户体验。虽然名字中包含 XML,但实际上,Ajax 可以使用多种数据格式,不仅限于 XML。
为什么使用 Ajax?
在 Web 开发中,我们常常需要从服务器获取数据或向服务器发送数据,而传统的同步请求会导致整个页面的刷新,用户体验较差。Ajax 的异步请求机制可以在不干扰用户当前操作的情况下与服务器进行数据交互,使页面变得更加动态和高效。
原生 JavaScript 中的 Ajax 实现
在原生 JavaScript 中,我们可以使用 XMLHttpRequest 对象来创建和处理 Ajax 请求。以下是一个简单的例子,演示如何使用原生 JavaScript 发起一个简单的 GET 请求:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>原生 JavaScript 中的 Ajax 实现</title>
</head>
<body><button id="loadDataButton">加载数据</button><div id="dataContainer"></div><script>document.getElementById('loadDataButton').addEventListener('click', loadData);function loadData() {// 创建 XMLHttpRequest 对象var xhr = new XMLHttpRequest();// 配置请求,使用 GET 方法请求数据xhr.open('GET', 'https://jsonplaceholder.typicode.com/posts/1', true);// 注册回调函数,处理响应数据xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {// 响应已完成且请求成功var data = JSON.parse(xhr.responseText);document.getElementById('dataContainer').innerText = data.title;}};// 发送请求xhr.send();}</script>
</body>
</html>
在这个例子中,我们首先创建了一个 XMLHttpRequest 对象,然后使用 open 方法配置请求。接着,我们注册了一个回调函数,当请求状态发生变化时,这个函数将被调用。最后,我们使用 send 方法发送请求。
请求状态
XMLHttpRequest 对象有一个 readyState 属性,表示请求的状态。常用的状态有:
0:未初始化,还没有调用open方法。1:启动,已经调用open方法,但尚未调用send方法。2:发送,已经调用send方法,但尚未接收到响应。3:接收,已经接收到部分数据。4:完成,已经接收到全部数据,而且已经可以在客户端使用。
在上面的例子中,我们通过检查 readyState 和 status 来确保请求已完成且成功。
异步与同步
在 open 方法的第三个参数中,我们传入了 true,表示使用异步请求。如果传入 false,则会使用同步请求。在实际开发中,建议使用异步请求,以免阻塞页面。
处理响应数据
在回调函数中,我们通过 xhr.responseText 获取响应的文本数据,并使用 JSON.parse 将其转换为 JavaScript 对象。然后,我们将获取到的数据展示在页面上。
POST 请求
除了 GET 请求,我们还可以使用 XMLHttpRequest 发起 POST 请求。以下是一个简单的例子:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>原生 JavaScript 中的 Ajax 实现(POST 请求)</title>
</head>
<body><button id="sendDataButton">发送数据</button><script>document.getElementById('sendDataButton').addEventListener('click', sendData);function sendData() {// 创建 XMLHttpRequest 对象var xhr = new XMLHttpRequest();// 配置请求,使用 POST 方法发送数据xhr.open('POST', 'https://jsonplaceholder.typicode.com/posts', true);// 设置请求头xhr.setRequestHeader('Content-Type', 'application/json');// 注册回调函数,处理响应数据xhr.onreadystatechange = function () {if (xhr.readyState === 4) {// 响应已完成if (xhr.status === 201) {console.log('数据发送成功!');} else {console.error('数据发送失败:', xhr.status, xhr.statusText);}}};// 构建要发送的数据对象var dataToSend = {title: 'foo',body: 'bar',userId: 1};// 将 JavaScript 对象转换为 JSON 字符串var jsonData = JSON.stringify(dataToSend);// 发送请求,将 JSON 字符串作为请求体xhr.send(jsonData);}</script>
</body>
</html>
在这个例子中,我们使用了 POST 方法,并在请求头中设置了 Content-Type 为 application/json,表示请求体中包含 JSON 数据。然后,我们将要发送的数据对象转换为 JSON 字符串,并通过 send 方法发送请求。
跨域请求
在浏览器中,有同源策略的限制,即默认情况下,Web 页面中的脚本只能访问与包含它的文档具有相同协议、主机和端口的资源。因此,当我们的页面和请求的资源不符合同源策略时,就会涉及到跨域请求的问题。
解决跨域问题的方式有很多种,其中一种常见的方法是使用 JSONP(在不涉及安全性问题时),另一种是使用 CORS(Cross-Origin Resource Sharing)。关于跨域请求的详细内容可以参考之前关于 Ajax 的博客中的相关章节。
Ajax 进阶:Fetch API
除了 XMLHttpRequest,现代浏览器还提供了 Fetch API,它是一种更现代、更强大的网络请求接口。下面是一个使用 Fetch API 的例子:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>使用 Fetch API 进行 Ajax 请求</title>
</head>
<body><button id="loadDataButton">加载数据</button><div id="dataContainer"></div><script>document.getElementById('loadDataButton').addEventListener('click', loadData);function loadData() {// 使用 Fetch API 发起 GET 请求fetch('https://jsonplaceholder.typicode.com/posts/1').then(response => {// 检查请求是否成功if (!response.ok) {throw new Error('请求失败:' + response.statusText);}// 将响应转换为 JSONreturn response.json();}).then(data => {// 成功接收到数据,处理响应document.getElementById('dataContainer').innerText = data.title;}).catch(error => {// 处理请求失败的情况console.error('请求失败:', error.message);});}</script>
</body>
</html>
使用 Fetch API 相比于 XMLHttpRequest 更加简洁,同时支持 Promise,使得代码更具可读性和可维护性。
结语
通过本文的学习,你应该对原生 JavaScript 中使用 Ajax 进行数据请求有了一定的了解。从最基础的 GET 和 POST 请求开始,再到处理跨域问题,最后介绍了使用 Fetch API 进行请求的现代方式。Ajax 技术是前端开发中不可或缺的一部分,掌握它将使你能够更灵活地处理数据,提高用户体验。
在实际项目中,可以根据具体需求选择使用 XMLHttpRequest 或 Fetch API,或者考虑使用一些现代的 JavaScript 框架和库,如 Axios、jQuery 等,来简化网络请求的代码。希望这篇博客对你有所帮助,愿你在前端开发的路上越走越远!
| 作者信息 作者 : 繁依Fanyi CSDN: https://techfanyi.blog.csdn.net 掘金:https://juejin.cn/user/4154386571867191 |
相关文章:
【Java 进阶篇】Ajax 实现——原生JS方式
大家好,欢迎来到这篇关于原生 JavaScript 中使用 Ajax 实现的博客!在前端开发中,我们经常需要与服务器进行数据交互,而 Ajax(Asynchronous JavaScript and XML)是一种用于创建异步请求的技术,它…...
Spring Cloud Stream实践
概述 不同中间件,有各自的使用方法,代码也不一样。 可以使用Spring Cloud Stream解耦,切换中间件时,不需要修改代码。实现方式为使用绑定层,绑定层对生产者和消费者提供统一的编码方式,需要连接不同的中间…...
高精度算法【Java】(待更新中~)
高进度加法 在Java中可以使用BigInteger进行高精度计算,除此也可以仿照竖式相加的计算原理进行计算。 BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。另外,BigInteger 还提供以下运算࿱…...
说一说HTTP1.0、1.1、2.0版本区别和优化
说一说HTTP1.0、1.1、2.0版本区别和优化 HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的应用层协议。 在不同的版本中,HTTP经历了一系列的演进和改进,主要包括HTTP 1.0、HTTP 1.1和HTTP 2.0。 下面详细解释它们之间…...
51.Sentinel微服务保护
目录 (1)初识Sentinel。 (1.1)雪崩问题及解决方案。 (1.1.1)雪崩问题。 (1.1.2)解决雪崩问题的四种方式。 (1.1.3)总结。 (1.2)…...
【Java 进阶篇】Ajax 实现——JQuery 实现方式 `ajax()`
嗨,亲爱的读者们!欢迎来到这篇关于使用 jQuery 中的 ajax() 方法进行 Ajax 请求的博客。在前端开发中,jQuery 提供了简便而强大的工具,其中 ajax() 方法为我们处理异步请求提供了便捷的解决方案。无需手动创建 XMLHttpRequest 对象…...
I.MX6ULL开发笔记(一)——环境搭建、镜像烧录、网络连接
本系列为使用野火IMX6ULL开发的学习笔记,使用的开发板为如下: 具有的硬件资源有如下: 文章目录 一、环境搭建Win11安装WSL安装串口驱动安装串口工具安装Ubuntu与windows文件互传 二、镜像烧录修改串口终端登录前信息 三、fire-config工具配…...
Javaweb之Ajax的详细解析
1.1 Ajax介绍 1.1.1 Ajax概述 我们前端页面中的数据,如下图所示的表格中的学生信息,应该来自于后台,那么我们的后台和前端是互不影响的2个程序,那么我们前端应该如何从后台获取数据呢?因为是2个程序,所以…...
java基于RestTemplate的微服务发起http请求
实现的效果...
django理解02 前后端分离中的问题
前后端分离相对于传统方式的问题 前后端数据交换的问题跨域问题 页面js往自身程序(django服务)发送请求,这是浏览器默认接受响应 而请求其它地方是浏览器认为存在潜在危险。自动隔离请求!!! 跨域问题的解决…...
设计模式-迭代器模式-笔记
动机(Motivaton) 在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们呢希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“同一…...
【数据结构】C语言实现队列
目录 前言 1. 队列 1.1 队列的概念 1.2 队列的结构 2. 队列的实现 2.1 队列的定义 2.2 队列的初始化 2.3 入队 2.4 出队 2.5 获取队头元素 2.6 获取队尾元素 2.7 判断空队列 2.8 队列的销毁 3. 队列完整源码 Queue.h Queue.c 🎈个人主页:…...
牛客——OR36 链表的回文结构(C语言,配图,快慢指针)
目录 思路一:链表翻转 思路二:快慢指针,分别从头和尾间开始比较 本题是没有对C的支持的,但因为CPP支持C,所以这里就用C写了,可以面向更多用户 链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 思路一&am…...
Docker build 技巧 —— 筑梦之路
实现目标 更快的构建速度 更小的Docker镜像大小 更少的Docker镜像层 充分利用镜像缓存 增加Dockerfile可读性 让Docker容器使用起来更简单 如何实现 编写.dockerignore文件 容器只运行单个应用 将多个RUN指令合并为一个 基础镜像的标签不要用latest 每个RUN指令后删除…...
2 Redis的高级数据结构
1、Bitmaps 首先,最经典的应用场景就是用户日活的统计,比如说签到等。 字段串:“dbydc”,根据对应的ASCII表,最后可以得到对应的二进制,如图所示 一个字符占8位(bit),…...
Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
update_engine-FilesystemVerifierAction和PostinstallRunnerAction
在介绍完了DownloadAction之后,还剩下FilesystemVerifierAction和PostinstallRunnerAction,下面开始对其进行分析。 FilesystemVerifierAction 在数据下载完成后,在DownloadAction中会切换到FilesystemVerifierAction void DownloadAction:…...
深度学习乳腺癌分类 计算机竞赛
文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度,召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…...
【Python百宝箱】掌握Python Web开发三剑客:Flask、Django、FastAPI一网打尽
前言 在当今互联网时代,Web应用的开发变得愈发重要和复杂。选择一个合适的Web框架,掌握安全性与认证、数据库与ORM库、前端框架与交互、测试与调试工具等关键知识点,是每个Web开发者都必须面对的挑战。本文将带你深入了解三个流行的Python W…...
【人工智能时代的刑法体系与责任主体概述】
第一节:引言 随着科技的快速发展,人工智能 (Artificial Intelligence, AI) 正日益成为我们生活中不可或缺的一部分。从自动驾驶汽车到语音助手,从智能家居到金融机器人,AI 的广泛应用正不断改变着我们的生活方式和社会结构。然而…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
