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

news2024/9/20 20:46:40

在这里插入图片描述

大家好,欢迎来到这篇关于原生 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:完成,已经接收到全部数据,而且已经可以在客户端使用。

在上面的例子中,我们通过检查 readyStatestatus 来确保请求已完成且成功。

异步与同步

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-Typeapplication/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);
                    }
                    // 将响应转换为 JSON
                    return 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1231209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业级SSD还是一个巨大的蓝海~

根据Allied Market Research市场分析报告显示&#xff0c;2020 年全球企业级 SSD 市场规模为 178.5 亿美元&#xff0c;预计到 2030 年将达到 468.9 亿美元&#xff0c;2021 年至 2030 年的复合年增长率为 10.2%。 扩展阅读&#xff1a;华为展望&#xff5c;2030年数据中心存储…

mysql面试题——存储引擎相关

一&#xff1a;MySQL 支持哪些存储引擎? MySQL支持多种存储引擎&#xff0c;比如InnoDB&#xff0c;MyISAM&#xff0c; MySQL大于等于5.5之后&#xff0c;默认存储引擎是InnoDB 二&#xff1a;InnoDB 和 MyISAM 有什么区别? InnoDB支持事务&#xff0c;MyISAM不支持InnoD…

Redis-核心数据结构

五种数据结构 String结构 String结构应用场景 Hash结构 Hash结构应用场景 List结构 List结构应用场景 Set结构 Set结构应用场景 ZSet有序结构 ZSet有序结构应用场景

基于SSM的供电公司安全生产考试系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

ES6中实现继承

本篇文章主要说明在ES6中如何实现继承&#xff0c;学过java的小伙伴&#xff0c;对class这个关键字应该不陌生&#xff0c;ES6中也提供了class这个关键字作为实现类的语法糖&#xff0c;咱们一起实现下ES6中的继承。 实现思路 首先直接通过class来声明一个Teacther类&#xff…

《微信小程序开发从入门到实战》学习二十二

3.3 开发创建投票页面 3.3.10 使用switch开关组件 用switch开关组件增加一个设置是否匿名投票的功能。 switch常用属性如下&#xff1a; checked 开还是关&#xff0c;默认false关 disabled 是否禁用&#xff0c;默认false不禁用&#xff0…

手把手从零开始训练YOLOv8改进项目(官方ultralytics版本)教程

手把手从零开始训练 YOLOv8 改进项目 (Ultralytics版本) 教程,改进 YOLOv8 算法 本文以Windows服务器为例:从零开始使用Windows训练 YOLOv8 算法项目 《芒果 YOLOv8 目标检测算法 改进》 适用于芒果专栏改进 YOLOv8 算法 文章目录 官方 YOLOv8 算法介绍改进网络代码汇总第…

【十字链表,邻接多重表(无向图的另一种链式存储结构),图的遍历】

文章目录 十字链表邻接多重表&#xff08;无向图的另一种链式存储结构&#xff09;图的遍历 十字链表 方便找到入度和出度边。 顶点结点&#xff1a; data&#xff1a;顶点存放的数据域。 firstin&#xff1a;第一个入度边。 firstout&#xff1a;第一个出度边。 弧度结点&am…

四旋翼无人机的飞行原理--【其利天下分享】

近年来&#xff0c;无人机在多领域的便捷应用促使其迅猛的发展&#xff0c;如近年来的多场战争&#xff0c;无人机的战场运用发挥得淋漓尽致。 下面我们针对生活中常见的四旋翼无人机的飞行原理做个基础的介绍&#xff0c;以飨各位对无人机有兴趣的朋友。 一&#xff1a;四旋翼…

Java值传递和引用传递

在Java中&#xff0c;有值传递&#xff08;Pass-by-Value&#xff09;和引用传递&#xff08;Pass-by-Reference&#xff09;两种参数传递方式。 值传递&#xff08;Pass-by-Value&#xff09;&#xff1a;当使用值传递方式时&#xff0c;方法将参数的副本传递给调用方法。这意…

Windows SDK

Windows SDK (10.0.22621) for Windows 11&#xff0c;版本 22H2 (2023 年 10 月更新) 提供了用于生成 Windows 应用程序的最新标头、库、元数据和工具。 使用此 SDK 为Windows 11版本 22H2 和早期 Windows 版本生成通用 Windows 平台 (UWP) 和 Win32 应用程序。 Windows 应用…

【图数据库实战】HugeGraph图计算流程

HugeGraph是一款易用、高效、通用的开源图数据库系统&#xff08;Graph Database&#xff0c;GitHub项目地址&#xff09;&#xff0c; 实现了Apache TinkerPop3框架及完全兼容Gremlin查询语言&#xff0c; 具备完善的工具链组件&#xff0c;助力用户轻松构建基于图数据库之上的…

编程刷题网站以及实用型网站推荐

1、牛客网在线编程 牛客网在线编程https://www.nowcoder.com/exam/oj?page1&tab%E8%AF%AD%E6%B3%95%E7%AF%87&topicId220 2、力扣 力扣https://leetcode.cn/problemset/all/ 3、练码 练码https://www.lintcode.com/ 4、PTA | 程序设计类实验辅助教学平台 PTA | 程…

NAS层协议栈学习笔记

NAS(Non-Access Stratum)是无线网络中非接入层及包括移动性管理(MM)和会话管理(SM)协议 &#xff0c;在5G(NR)系统中连接管理(Connection Management)用于建立和释放UE与AMF之间的控制面(CP)信令连接。 5G中移动性管理是通过NAS信令在UE与核心网之间进行交互的&#xff0c;连接…

Java-类和类的关系

代码 总结&#xff1a; 【1】面向对象的思维&#xff1a;找参与者&#xff0c;找女孩类&#xff0c;找男孩类 【2】体会了什么叫方法的形参&#xff0c;什么叫方法的实参&#xff1a; 具体传入的内容 实参&#xff1a; 【3】类和类可以产生关系&#xff1a; &#xff08;1…

【计算机视觉】24-Object Detection

文章目录 24-Object Detection1. Introduction2. Methods2.1 Sliding Window2.2 R-CNN: Region-Based CNN2.3 Fast R-CNN2.4 Faster R-CNN: Learnable Region Proposals2.5 Results of objects detection 3. SummaryReference 24-Object Detection 1. Introduction Task Defin…

给大伙讲个笑话:阿里云服务器开了安全组防火墙还是无法访问到服务

铺垫&#xff1a; 某天我在阿里云上买了一个服务器&#xff0c;买完我就通过MobaXterm进行了ssh&#xff08;这个软件是会保存登录信息的&#xff09; 故事开始&#xff1a; 过了n天之后我想用这个服务器来部署流媒体服务&#xff0c;咔咔两下就部署好了流媒体服务器&#x…

Android Studio常见问题

Run一直是上次的apk 内存占用太大&#xff0c;导致闪退

ESP32-BLE基础知识

一、存储模式 两种存储模式&#xff1a; 大端存储&#xff1a;低地址存高字节&#xff0c;如将0x1234存成[0x12,0x34]。小端存储&#xff1a;低地址存低字节&#xff0c;如将0x1234存成[0x34,0x12]。 一般来说&#xff0c;我们看到的一些字符串形式的数字都是大端存储形式&a…

单片非晶磁性测量系统磁参量指标

1. 概述 单片非晶磁性测量系统是专用于测量非晶或纳米晶薄片(带)交流磁特性的装置&#xff0c;由精密励磁及测量装置 ( 40 Hz&#xff5e;65 Hz&#xff0c;可定制至400 Hz )、单片磁导计、全自动测量软件组成。使用该装置可在能耗、效率、材料均匀性/一致性、可靠性、整个生命…