“探索AJAX:前端与后端数据交互的利器“

前言

在现代Web开发中,前端与后端之间的数据交互是一个至关重要的环节。为了实现无需刷新页面的动态更新,AJAX(Asynchronous JavaScript and XML)作为一种强大的技术被广泛应用。

AJAX的原理

AJAX通过JavaScript和XMLHttpRequest对象实现异步通信,使得前端能够向后端发送请求并获取响应,而无需刷新整个页面。它的核心思想是在后台发送HTTP请求,然后通过回调函数处理服务器返回的数据。这种异步通信的方式带来了更好的用户体验和性能优化。

AJAX的使用方法

  1. 创建XMLHttpRequest对象:使用JavaScript创建一个XMLHttpRequest对象,该对象负责发送HTTP请求和接收服务器的响应。
let xhr = new XMLHttpRequest();
  1. 指定请求类型和URL:设置XMLHttpRequest对象的请求类型(GET或POST)和目标URL,以确定要向服务器发送何种请求。
xhr.open('GET', 'http://api.example.com/data', true);
  1. 发送请求:调用XMLHttpRequest对象的open()和send()方法,将请求发送到服务器。
xhr.send();
  1. 处理服务器响应:通过监听XMLHttpRequest对象的readyState和status属性,可以实时获取服务器的响应状态和数据。
xhr.onreadystatechange = function() {
    if (xhr.readyState === 4 && xhr.status === 200) {
        console.log(xhr.responseText);
    }
};
  1. 更新页面内容:根据服务器返回的数据,使用JavaScript动态更新页面内容,实现无刷新效果。
document.getElementById('result').innerHTML = xhr.responseText;

XMLHttpRequest对象的readyState属性

XMLHttpRequest对象的readyState属性用于表示当前请求的状态,它有以下几个可能的取值:

readyState = 0 :初始状态。XMLHttpRequest对象已创建,但还没有调用open()方法。
readyState = 1 :open()方法已被调用。请求已经准备好进行初始化,但尚未发送。
readyState = 2 :send()方法已被调用,并且所有响应头部都已经接收到。
readyState = 3 :正在下载响应体。responseText属性中已经获取了部分数据。
readyState = 4 :请求操作已完成。整个响应体已经下载完毕,或者请求遇到了错误。

这些不同的状态反映了XMLHttpRequest对象在请求过程中的不同阶段。我们可以通过监听其onreadystatechange事件来获取并处理readyState属性的变化。当readyState的值发生变化时,我们可以根据具体的状态执行相应的操作。

例如,在readyState为4时,我们可以通过检查status属性来确定请求是否成功,并访问responseText或responseXML属性来获取服务器返回的数据。

使用XMLHttpRequest对象时,我们应该处理各个readyState状态的变化,以确保请求和响应的正确处理。同时,为了提高用户体验,我们可以在请求过程中显示加载指示器或其他反馈信息,以便用户知道请求的状态和进展情况。

XMLHttpRequest对象的status属性

XMLHttpRequest对象的status属性表示HTTP响应状态码。它是一个三位数字,用于指示服务器对请求的处理结果。

HTTP响应状态码通常分为以下几类:

1xx:信息提示。服务器已经接收到请求,但需要进一步操作才能完成它。
2xx:成功。请求已经被成功处理,并得到了正确的响应。
3xx:重定向。客户端需要进一步采取操作才能完成请求。
4xx:客户端错误。请求包含错误或无法完成。
5xx:服务器错误。服务器无法完成请求。

以下是一些常见的HTTP状态码及其含义:

-   200 OK:请求成功。服务器成功地返回了所请求的数据。
-   201 Created:请求成功,并且服务器创建了新的资源。
-   204 No Content:请求成功,但没有返回任何数据。
-   301 Moved Permanently:请求的资源已经永久移动到新的URL。
-   400 Bad Request:请求包含错误,并且服务器无法理解或处理它。
-   401 Unauthorized:请求需要用户验证。
-   403 Forbidden:服务器拒绝了请求。
-   404 Not Found:请求的资源不存在。
-   500 Internal Server Error:服务器遇到了错误,无法完成请求。

在使用XMLHttpRequest对象时,我们可以通过检查status属性来确定服务器是否成功地处理了请求。

例如,当status为200时,表示请求成功,并且可以访问responseText或responseXML属性来获取服务器返回的数据。

比较AJAX请求的三种方式

下面将介绍三种常见的AJAX请求方式:原生JavaScript、jQuery和fetch,并对它们的相同点和不同点进行比较。

原生JavaScript

    <script>
        // 获取按钮元素
        let btn = document.getElementById('btn')
     
        // 给按钮绑定点击事件
        btn.addEventListener('click', () => {
            // 发送一个http请求
            let xhr = new XMLHttpRequest()
            // 指定请求方式和请求的URL
            xhr.open('GET', 'http:192.168.31.26:3000/top/song?type=7', true)
            // 监听请求状态变化
            xhr.onreadystatechange = () => {
                // 如果请求已完成,并且响应状态码为200,表示请求成功
                if (xhr.readyState === 4 && xhr.status === 200) {
                    // 将响应数据转换成JavaScript对象
                    const result = JSON.parse(xhr.responseText).data
                    // 在控制台输出结果
                    console.log(result);   
                }
            }
            // 发送请求
            xhr.send()
        })
    </script>

具体解释如下:

  1. 通过<script>标签嵌入JavaScript代码。

  2. 使用document.getElementById('btn')获取按钮元素,然后将其赋值给变量btn

  3. 使用addEventListener()方法给按钮绑定点击事件的监听器。当按钮被点击时,回调函数会被执行。

  4. 在回调函数中,创建了一个新的XMLHttpRequest对象xhr,用于发送HTTP请求。

  5. 使用xhr.open()方法配置请求的类型(GET)、URL和是否异步(true)。

  6. 通过xhr.onreadystatechange属性指定一个回调函数,该函数会在请求状态发生变化时被触发。

  7. 在回调函数中,使用xhr.readyState获取当前请求状态,xhr.status获取响应状态码。

  8. 如果请求状态为4(请求已完成),并且响应状态码为200(请求成功),则执行以下代码:

    a. 使用xhr.responseText获取响应的文本数据。

    b. 使用JSON.parse()方法将文本数据转换为JavaScript对象。

    c. 将转换后的结果赋值给变量result

    d. 使用console.log()将结果输出到控制台。

  9. 最后,通过xhr.send()方法发送请求。

总之,这段代码使用了原生JavaScript中的XMLHttpRequest对象来发送HTTP GET请求,并通过监听请求状态变化,获取并处理响应数据

jQuery:

<!-- 引入jQuery库 -->
    <script src="http://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <script>
        // 获取按钮元素
        let btn = document.getElementById('btn')
        
        // 给按钮绑定点击事件
        btn.addEventListener('click', () => {
            // 发起Ajax请求
            $.ajax({
                url: 'http:192.168.31.26:3000/top/song?type=7', // 请求地址
                method: 'GET', // 请求方法
                dataType: 'json', // 期望的响应数据类型
                success: (res) => { // 请求成功的回调函数
                    console.log(res); // 在控制台输出响应结果
                }
            })
        })
    </script>

这段代码与之前的代码相比,引入了jQuery库,使用其提供的$.ajax()方法发起异步请求。

具体解释如下:

  • 首先,通过<script>标签引入了CDN上托管的jQuery库。
  • 在按钮点击事件的回调函数中,使用$.ajax()方法发起异步请求。
  • $.ajax()方法的配置对象中,通过url指定请求的地址为http:192.168.31.26:3000/top/song?type=7,即获取类型为"7"的新歌。
  • 使用method: 'GET'指定请求的方法为GET。
  • 通过dataType: 'json'指定期望的响应数据类型为JSON。
  • success属性中,定义了请求成功时的回调函数,其中的(res) => { console.log(res); }会在请求成功后被执行,并将响应结果输出到控制台。

总之,这段代码使用了jQuery库提供的$.ajax()方法发起异步请求,相对于传统的XMLHttpRequest对象,它提供了更简洁的语法和更好的兼容性。同时,通过配置对象可以灵活地设置请求的URL、方法、期望的响应数据类型以及请求成功时的回调函数。

fetch:

<!-- 引入jQuery库 -->
    <script src="http://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <script>
        // 获取按钮元素
        let btn = document.getElementById('btn')
        
        // 给按钮绑定点击事件
        btn.addEventListener('click', () => {
            // 使用fetch API发起异步请求
            fetch('http:192.168.31.26:3000/top/song?type=7')
                .then((data) => {
                    // 将响应数据解析为JSON格式
                    return data.json()
                })
                .then((res) => {
                    // 打印响应结果到控制台
                    console.log(res);
                })
        })
    </script>

这段代码使用了原生JavaScript中的fetch()方法来发起异步请求,相较于之前的代码,不再依赖于jQuery库。

具体解释如下:

  • 首先,通过<script>标签引入了CDN上托管的jQuery库。
  • 在按钮点击事件的回调函数中,使用fetch()方法发起异步请求。
  • fetch()方法接收一个URL作为参数,并返回一个Promise对象,表示异步操作的结果。
  • 通过then()方法链,将返回的数据流转换为JSON格式,并在第二个then()中处理响应结果。
  • 在第二个then()中,定义了一个回调函数,该函数接收解析后的JSON响应结果作为参数,并将其打印到控制台。

相同点:

  1. 都可以实现异步请求:这三种方式都能够发送异步请求,不会阻塞页面的加载和渲染。
  2. 都支持GET和POST请求:无论是原生JavaScript、jQuery还是fetch,都可以发送GET和POST请求,并且可以设置请求参数。
  3. 都支持处理响应数据:无论使用哪种方式,都可以获取到服务器返回的响应数据,并对其进行处理。

不同点:

  1. 语法和用法差异:原生JavaScript使用XMLHttpRequest对象来发送请求,需要手动设置请求头、监听状态变化等。而jQuery和fetch则提供了更简洁易用的API,对请求的各个环节进行了封装,使用起来更加方便。
  2. 第三方库依赖:原生JavaScript是浏览器原生支持的,不需要引入额外的库。而jQuery和fetch需要引入相应的库文件,如上述代码中使用的jQuery和fetch API。
  3. 对错误处理的支持:原生JavaScript和jQuery都提供了错误处理的机制,可以通过回调函数来处理请求过程中可能出现的错误。而fetch则使用Promise机制,可以链式调用then()和catch()方法来处理成功和失败的情况。
  4. 对不同数据类型的支持:原生JavaScript和fetch可以根据设置的dataType或响应头自动解析不同的数据类型,如JSON、XML等。而jQuery则可以通过设置dataType参数来指定期望的响应数据类型。

综上所述,原生JavaScript、jQuery和fetch都是常见的AJAX请求方式,各自有着不同的特点和适用场景。

结语

AJAX作为前端与后端数据交互的利器,给现代Web开发带来了巨大的便利和灵活性。通过理解AJAX的原理和使用方法,并注意相关的注意事项,我们可以更好地利用AJAX来提升网站的用户体验、性能和功能拓展。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python 爬虫篇(3)---->Beautiful Soup 网页解析库的使用(包含实例代码)

Beautiful Soup 网页解析库的使用 文章目录 Beautiful Soup 网页解析库的使用前言一、安装Beautiful Soup 和 lxml二、Beautiful Soup基本使用方法标签选择器1 .string --获取文本内容2 .name --获取标签本身名称3 .attrs[] --通过属性拿属性的值标准选择器find_all( name , at…

2003-2021年地级市实际利用外资数据/地级市实际利用FDI数据

2003-2021年地级市实际利用外商直接投资数据/地级市FDI数据 1、时间&#xff1a;2003-2021年 2、来源&#xff1a;城市年鉴、统计公报、省统计年鉴&#xff0c;已尽最大程度进行填补 3、指标&#xff1a;省份代码、城市代码、省份、城市、年份、当年实际使用外资金额&#x…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏15(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言实现树倒下的效果拾取圆木砍树消耗卡路里斧头手臂穿模问题处理源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中&…

新春贺词 | 人大金仓笃行不怠,初心不改!

新春贺词 冬至阳生&#xff0c;岁回律转&#xff0c;在这岁律更新的美好时刻&#xff0c;谨向长期以来关心和支持金仓发展的用户、领导和朋友们致以诚挚的问候和感谢&#xff01;向一年来为了金仓事业发展奋战拼搏的全体金仓人及家属致以美好的新春祝福&#xff01; 回首2023&a…

Bert下载和使用(以bert-base-uncased为例)

Bert官方github地址&#xff1a;https://github.com/google-research/bert?tabreadme-ov-file 【hugging face无法加载预训练模型】OSError&#xff1a;Can‘t load config for ‘./bert-base-uncased‘. If you‘re trying 如何下载和在本地使用Bert预训练模型 以bert-base-u…

多 split 窗口 in Gtkmm4

文章目录 效果预览实现概要源代码 效果预览 实现概要 使用Gtk::Paned虽然 Paned 只能装两个子控件, 但是我可以嵌套 paned1 装 box1 和 box2 paned2 装 paned1 和 box3 源代码 #include <gtkmm.h> class ExampleWindow : public Gtk::Window { public:ExampleWindow()…

二阶系统的迹-行列式平面方法(trace-determinant methods for 2nd order system)

让我们再次考虑二阶线性系统 d Y d t A Y \frac{d\mathbf{Y}}{dt}A\mathbf{Y} dtdY​AY 我们已经知道&#xff0c;分析这种二阶系统。最主要的是注意它的特征值情形。 &#xff08;此处没有重根的情形&#xff0c;所有是partial&#xff09; 而特征值&#xff0c;也就是系…

Amazon Dynamo学习总结

目录 一、Amazon Dynamo的问世 二、Amazon Dynamo主要技术概要 三、数据划分算法 四、数据复制 五、版本控制 六、故障处理 七、成员和故障检测 一、Amazon Dynamo的问世 Amazon Dynamo是由亚马逊在2007年开发的一种高度可扩展和分布式的键值存储系统&#xff0c;旨在解…

基于Python的HTTP隧道安全性分析:魔法背后的锁与钥匙

当我们谈论基于Python的HTTP隧道时&#xff0c;不禁让人想起那些神秘的魔法门。但是&#xff0c;在魔法背后&#xff0c;我们也需要确保安全性&#xff0c;就像需要确保魔法不会落入邪恶之手一样。那么&#xff0c;基于Python的HTTP隧道在安全性方面表现如何呢&#xff1f;让我…

JPEG图像格式加速神经网络训练--使用DCT训练CNN

JPEG图像格式加速神经网络训练 JPEG图像格式加速神经网络训练工作原理DCT系数与JPEG直接利用DCT系数阶段 1: 数据准备步骤 1: 读取JPEG文件结构步骤 2: 提取量化表和Huffman表步骤 3: 解析图像数据步骤 4: 反量化步骤 5: 获取DCT系数 阶段 2: 输入处理预处理 1: 正规化&#xf…

轻薄型工业平板亿道EM-T195,续航持久高达10小时

时尚而坚固的 10.1英寸EM-T195触摸屏平板电脑融合了高耐力和无与伦比的适应性&#xff0c;可抵御极端天气条件和多重冲击&#xff0c;借助强大的联发科8核处理器&#xff0c;它可以从容面对任何工作挑战。 其读取能力&#xff08;2D 成像器&#xff09;结合其坚固性&#xff0…

波奇学Linux: 文件描述符

文件和操作系统的关系 操作系统控制进程&#xff0c;文件的打开是在进程中进行。意味着用来控制进程的PCB必然有文件的信息&#xff0c;操作系统通过控制PCB的信息来控制文件的读写。 Q1&#xff1a;如何证明文件打开是在进程中进行&#xff1f; 编写c文件调用fopen来操作文件…

数据结构——单向链表和双向链表的实现(C语言版)

目录 前言 1. 链表 1.1 链表的概念及结构 1.2 链表的分类 2. 单链表接口实现 2.1 数据结构设计与接口函数声明 2.2 创建结点&#xff0c;打印&#xff0c;查找 2.3 尾插&#xff0c;头插&#xff0c;尾删&#xff0c;头删 2.4 插入或删除 2.4.1在指定位置后 2.4.2在…

OpenCV-34 顶帽操作和黑帽操作

一、顶帽操作&#xff08;TOPHAT&#xff09; 顶帽 原图 - 开运算 开运算的效果是去除图像外的噪点&#xff0c;因此原图 - 开运算就得到了去掉的噪点。 通过API --- morphologyEx&#xff08;img&#xff0c; MORPH_TOPHAT&#xff0c; kernel&#xff09; 示例代码如下&…

C++基础知识点预览

一.绪论&#xff1a; 1.1 C简史&#xff1a; 与C的关系&#xff1a; 被设计为C语言的继任者&#xff0c;C语言是一种过程型语言&#xff0c;程序员使用它定义执行特定操作的函数&#xff0c;而C是一种面向对象的语言&#xff0c;实现了继承、抽象、多态和封装等概念。C支持类&…

Spring Boot 笔记 004 自动配置和自定义starter

003讲到了导入jar包中的方法&#xff0c;但其实是个半成品&#xff0c;别人写的jar包中的方法我要在自己的代码中去调用&#xff0c;非常的不方便。原则上写给别人用的jar包&#xff0c;人家要能直接用&#xff0c;而不用写注入的方法。 在springboot中会自动扫描imports文件中…

【FFmpeg】ffplay 命令行参数 ⑤ ( 设置音频滤镜 -af 参数 | 设置统计信息 -stats 参数 | 设置同步时钟类型 -sync 参数 )

文章目录 一、ffplay 命令行参数 - 音频滤镜1、设置音频滤镜 -af 参数2、常用的 音频滤镜 参数3、音频滤镜链 示例 二、ffplay 命令行参数 - 统计信息1、设置统计信息 -stats 参数2、关闭统计信息 -nostats 参数 三、ffplay 命令行参数 - 同步时钟类型1、设置同步时钟类型 -syn…

从Socket中解析Http协议实现通信

在网络协议中&#xff0c;Socket是连接应用层和运输层的中间层&#xff0c;主要作用为了通信。Http协议是应用层上的封装协议。我们可以通过Http协议的规范解析Socket中数据&#xff0c;完成Http通信。 首先&#xff0c;我们先回顾一下Http协议的规范。主要复习一下&#xff0c…

YOLOv8改进 | 检测头篇 | 独创RFAHead检测头超分辨率重构检测头(适用Pose、分割、目标检测)

一、本文介绍 本文给大家带来的改进机制是RFAHead,该检测头为我独家全网首发,本文主要利用将空间注意力机制与卷积操作相结合的卷积RFAConv来优化检测头,其核心在于优化卷积核的工作方式,特别是在处理感受野内的空间特征时。RFAConv主要的优点就是增加模型的特征提取能力,…

【web前端开发】HTML及CSS简单页面布局练习

案例一 网页课程 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…
最新文章