JS宏进阶:XMLHttpRequest对象

一、概述

XMLHttpRequest简称XHR,它是一个可以在JavaScript中使用的对象,用于在后台与服务器交换数据,实现页面的局部更新,而无需重新加载整个页面,也是Ajax(Asynchronous JavaScript and XML)技术的核心组成部分。通过XHR对象,开发者可以在不干扰用户当前操作的情况下,向服务器请求数据,并动态更新网页内容。

二、对象的创建

1、在浏览器中的创建方式

根据浏览器的类型与版本差异,可能存在不同的创建方式。

1.1、现代流行的浏览器(如谷歌、火狐、Safari等等)中,可使用new关键字来进行创建,语法如下所示:

let xhr = new XMLHttpRequest();

1.2、旧版IE浏览器(IE6、IE7)等特立独行的浏览器中,需要使用ActiveXObject对象来进行创建,语法如下:

var xhr = new ActiveXObject("Microsoft.XMLHTTP");

因此,若是在浏览器中创建该对象,通常需要编写如下所示创建函数:

function createXMLHttpRequest() {
    let xhr;
    if (window.XMLHttpRequest) {
        //假设全局对象中存在 XMLHttpRequest 对象
        xhr = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        throw new Error("您的浏览器不支持XMLHttpRequest对象!");
    }
    return xhr;
}

2、在wps编辑器中的创建方式

在WPS的编辑器中,它是作为一个全局对象而存在的,因此创建方式与现代浏览器中一致,使用new关键字即可创建。

3、在node.js中的创建方式

在Node.js中,通常不会直接使用XMLHttpRequest对象,通常是作为第三方库而存在的,因此需要先行安装,命令如下:

npm install xmlhttprequest

随后通过require掉包,语法如下:

const XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest

三、常用属性

1、表示请求状态的readyState属性

它是一个整数,共有五个值,分别是:

readyState的值作用
0请求未初始化(尚未调用 open 方法)
1请求已初始化(已调用 open 方法,尚未调用 send 方法)
2请求已发送(已调用 send 方法,尚未收到响应)
3请求处理中(已接收部分响应数据)
4请求已完成(已接收全部响应数据)

2、表示服务器响应的HTTP状态码的status属性

它是一个整数,表示响应状态码,常见的状态码如下所示(最为常见的以标红):

2.1、信息性状态码

信息性状态码通常是1开头的整数,如:100表示服务器已经接收到请求头,客户端应当继续发送请求的剩余部分,或者如果请求已经完成,则忽略这个响应;101表示服务器已经理解了客户端的请求,并将通过Upgrade消息头通知客户端采用不同的协议来完成这个请求。

2.2、成功响应状态码

表示响应成功的状态码通常是以2开头的整数,如:200(OK)表示请求已成功,请求所希望的响应头或数据体将随此响应返回;201(created)表示请求成功并且服务器创建了新的资源;202(accepted)表示请求已经接受,但处理尚未完成;204(no content)表示服务器成功处理了请求,但没有返回任何内容;206表示服务器成功处理了部分GET请求。

2.3、重定向

表示重定向的状态码通常是3开头的状态码,如:301表示请求的网页已永久移动到新位置;302表示请求的网页已临时移动到新位置;304表示自从上次请求后,请求的网页未修改过,客户端可以直接从本地缓存中获取数据;307表示临时性的重定向,与302类似,但与POST请求一起使用时有所不同。

2.4、客户端错误响应

此类状态码通常是以4开头的整数,如:400表示服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求;401表示请求未授权,需要用户通过表单提交一个包含适当的认证令牌来访问该网页;403表示服务器理解请求,但拒绝执行此请求;404表示服务器无法根据客户端的请求找到资源(网页);408表示请求超时,服务器等待客户端发送请求时等待时间过长。

2.5、服务器错误响应

这类状态码,通常是5开头的整数,如:500表示服务器遇到了一个未曾预料的情况,导致它无法完成对请求的处理;502表示作为网关或代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应;503表示由于临时的服务器维护或过载,服务器当前无法处理请求,这个状况是临时的;504表示网关在等待来自另一个服务器的响应时超时‌。

3、表示服务器响应的HTTP状态码对应的文本信息的statusText属性

它是一个字符串,与status一致表示响应状态,只是它是一个文本信息,例如:状态码200对应的文本就是OK,如果你发送的请求成功,且statuts的值是200,那么statusText的值就是OK。

4、表示服务器响应的文本内容的responseText属性

当且仅当readyState的值等于4时,才可以读取responseText的值。其类型一般来说是一个JSON字符串,也可能时网页源码等。

5、表示服务器响应的XML内容responseXML属性

当且仅当readyState的值等于4且响音内容的格式是XML时,才可以读取responseXML的值。

四、常用方法

1、打开一个url的open方法

open(method, url, async, username, password)

method:请求方式,是一个字符串,如:POST、GET、PUT等

url:请求地址,是一个字符串,如:https://www.baidu.com

async:一个布尔值,表示请求是否为异步请求

username(可选):用户名,用于身份验证

password(可选):用户密码,用于身份验证

该方法的作用是初始化一个请求,调用后,readyState属性的值会设置为1

2、发送请求到服务器send方法

send(data)

data:表示要发送的数据,对于GET请求,可以设置为空,因为get请求要发送的数据可以直接拼接在网址的后面,对于POST请求,应视网页情况而定,有可能是From Data、Blob等,如下图所示:

3、设置请求头setRequestHeader方法

setRequestHeader(header, value)

header:请求头名称

value:请求头的值

4、获取响应头的值getResponseHeader方法

getResponseHeader(headerName)

headerName:要获取的响应头的名称

注意:必须在readyState=4时,才能获取

5、获取响应头信息getAllResponseHeader方法

getAllResponseHeaders()

同样的,必须在readyState=4时,才能获取

6、取消请求abort方法

直接调用.abort()即可,主要作用是取消当前请求。

五、事件函数

1、onreadystatechange

它是一个函数,当readyState属性发生变化时调用的回调函数。开发者可以在此函数中检查readyState的值,以确定请求的状态,并据此执行相应的操作。

xhr.onreadystatechange = function() {
    if (xhr.readyState === 4 && xhr.status === 200) {
        console.log('请求成功', xhr.responseText);
    }
};

2、addEventListener

与onreadystatechange类似,但它是一个更为灵活的监听事件函数,可惜WPS编辑器不支持。

xhr.addEventListener('readystatechange', function() {
    if (xhr.readyState === 4 && xhr.status === 200) {
        console.log('请求成功', xhr.responseText);
    }
});
 
xhr.addEventListener('load', function() {
    console.log('数据加载完成', xhr.responseText);
});

xhr.addEventListener('error', function() {
    console.log('请求发生错误');
});

3、其他监听事件函数

//当请求成功完成时触发,即readyState变为4且status为200(或等效的成功状态码)时
xhr.onload = function() {
    console.log('数据加载完成', xhr.responseText);
};

//在请求过程中发生错误时触发,例如网络错误。
xhr.onerror = function() {
    console.log('请求发生错误');
};
 
//当请求被中止时触发,例如通过调用abort()方法。
xhr.onabort = function() {
    console.log('请求被中止');
};
 
//当请求超时时触发。这需要在请求初始化时设置timeout属性。
xhr.ontimeout = function() {
    console.log('请求超时');
};

//在请求开始时触发。
xhr.onloadstart = function() {
    console.log('请求开始');
};

//在接收响应数据时持续触发,可以用于实现进度条。
xhr.onprogress = function(event) {
    if (event.lengthComputable) {
        console.log(`已接收: ${event.loaded} 字节,总大小: ${event.total}`);
    }
};

//在请求完成或中止后触发,无论请求成功或失败。
xhr.onloadend = function() {
    console.log('请求结束');
};

上述监听事件函数,通常结合onreadystatechange一起使用,也可以只用onreadystatechange这一个事件来获取数据。

六、小试牛刀

function loadData() {
    var xhr = new XMLHttpRequest();

    // 设置响应处理函数
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4 && xhr.status == 200) {
            // 请求成功,处理响应数据
            console.log(xhr.responseText);
        }
    };

    // 初始化请求
    xhr.open("GET", "https://www.baidu.com", true);

    // 发送请求
    xhr.send(null);
}

效果如下所示:

七、注意事项

1、跨域

如果是在浏览器中,通常是不允许跨域请求的。因此,默认情况下,该对象只能请求与当前页面同源的资源。如果必要,需使用CORS机制。然在WPS编辑器中,没有这种限制。

2、同步

虽然该对象支持同步请求,但是不建议在生产环境中使用。因为同步请求会阻塞浏览器的UI线程,导致用户体验极差,也可能造成更为严重的后果。

3、错误处理

使用该对象进行请求时,需检查status属性,以确定请求是否成功。如果请求失败,应当采取适当的错误处理措施。

八、总结

XMLHttpRequest对象是一种强大的工具,用于在后台与服务器交换数据,实现页面的局部更新。通过合理使用XMLHttpRequest对象,可以显著提升网页的交互性和用户体验。然而,随着技术的发展,现代Web开发更倾向于使用更高级别的库(如fetch API)或框架(如React、Vue等)来处理HTTP请求,这些工具提供了更简洁、更现代的API,简化了开发过程。

注明:wps中也支持fetch API

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

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

相关文章

怎么查看电脑显存大小(查看电脑配置)

这里提供一个简单的方法查看 winr打开cmd 终端输入dxdiag进入DirectX 点击显示查看设备的显示内存(VRAM) 用这个方法查看电脑配置和显存是比较方便的 dxdiag功能 Dxdiag是Windows的DirectX诊断工具,其主要作用包括但不限于以下几点&#…

优惠券平台(一):基于责任链模式创建优惠券模板

前景概要 系统的主要实现是优惠券的相关业务,所以对于用户管理的实现我们简单用拦截器在触发接口前创建一个单一用户。 // 用户属于非核心功能,这里先通过模拟的形式代替。后续如果需要后管展示,会重构该代码 UserInfoDTO userInfoDTO new…

【机器学习】数据预处理之scikit-learn的Scaler与自定义Scaler类进行数据归一化

scikit-learn的Scaler数据归一化 一、摘要二、训练数据集和测试数据集的归一化处理原则三、scikit-learn中的Scalar类及示例四、自定义StandardScaler类进行数据归一化处理五、小结 一、摘要 本文主要介绍了scikit-learn中Scaler的使用方法,特别强调了数据归一化在…

机器学习中过拟合和欠拟合问题处理方法总结

目录 一、背景二、过拟合(Overfitting)2.1 基本概念2.2 过拟合4个最主要的特征2.3 防止过拟合的11个有效方法 三、欠拟合(Underfitting)3.1 基本概念3.2 欠拟合的4个特征3.3 防止欠拟合的11个有效方法 四、总结五、参考资料 一、背景 在机器学习模型训练…

ABP框架9——自定义拦截器的实现与使用

一、AOP编程 AOP定义:面向切片编程,着重强调功能,将功能从业务逻辑分离出来。AOP使用场景:处理通用的、与业务逻辑无关的功能(如日志记录、性能监控、事务管理等)拦截器:拦截方法调用并添加额外的行为,比如…

基于YoloV11和驱动级鼠标模拟实现Ai自瞄

本文将围绕基于 YoloV11 和驱动级鼠标实现 FPS 游戏 AI 自瞄展开阐述。 需要着重强调的是,本文内容仅用于学术研究和技术学习目的。严禁任何个人或组织将文中所提及的技术、方法及思路应用于违法行为,包括但不限于在各类游戏中实施作弊等违规操作。若因违…

示例代码:C# MQTTS双向认证(客户端)(服务器EMQX)

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

记录IMX6ULL开发板上移植SQLite3并运行Qt程序

文章目录 概要移植SQLite3Qt程序部署实验现象 概要 基于上一章对使用Qt运行对应的实验实例来完成对用户使用ui界面完成对SQLite数据库的增删改查等操作。本文旨在对上一句节的Qt程序部署到IMX6ULL开发板,并且完成对SQLite数据库在IMX6ULL开发板上的移植。 移植SQ…

达梦数据库(DM)线程管理

目录标题 达梦数据库(DM)线程管理笔记一、DM 线程架构概述二、DM 主要线程类型及功能(一)监听线程(二)工作线程(三)IO 线程(四)调度线程(五&#…

02.10 TCP之文件传输

1.思维导图 2.作业 服务器代码&#xff1a; #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> …

Node.js 环境配置

什么是 Node.js Node.js 是一个基于 Chrome V8 JavaScript 引擎的 JavaScript 运行时环境&#xff0c;它允许你在服务器端运行 JavaScript。传统上&#xff0c;JavaScript 主要用于浏览器中的前端开发&#xff0c;而 Node.js 使得 JavaScript 也能够在服务器上执行&#xff0c;…

【办公类-53-04】20250209Python模仿制作2024学年第二学期校历

背景需求&#xff1a; 马上开学了&#xff0c;又要制作校历&#xff08;删划节假日&#xff09;。之前我都是用网络的图片&#xff0c;然后在PPT里修改。 存在问题&#xff1a; 网络校历是从周日开始的&#xff0c;但日常我们老师做教案&#xff0c;都是默认从周一到周五&…

KERL文献阅读分享:知识图谱与预训练语言模型赋能会话推荐系统

标题期刊年份Knowledge Graphs and Pre-trained Language Models enhanced Representation Learning for Conversational Recommender SystemsJournal of LaTeX Class Files2021 &#x1f4c8;研究背景 在数字时代&#xff0c;个性化推荐系统已经成为了我们生活的一部分。从电…

强一致性算法:Raft

目录 什么是 Raft 算法&#xff1f; Leader的选举 投票分裂后的选举过程 Raft算法日志复制过程 修复不一样的日志 数据安全性的保证 什么是 Raft 算法&#xff1f; Raft 算法是一种是一种用于管理复制日志的强一致性算法&#xff0c;用于保证分布式系统中节点数据的一致…

[MyabtisPlus]PG的TIMESTAMPTZ不支持转换为LocalDateTime

背景 数据库用的是PG&#xff0c;且created_time字段用的是带时区的timestamptz类型&#xff1a; 用MyabtisPlus(MP)的的代码生成&#xff0c;默认生成的是JDK8的LocalDateTime类型&#xff1a; 结果&#xff0c;在查询时候&#xff0c;无法做到实体类的类型自动转换&#xff0…

cliproxy代理服务使用指南

Cliproxy代理服务使用指南 一、引言 Cliproxy&#xff0c;作为一款高效稳定的代理服务工具&#xff0c;广泛应用于跨境电商、数据分析、网络爬虫、远程办公等领域。本指南旨在帮助用户快速上手Cliproxy&#xff0c;充分利用其代理服务&#xff0c;提升工作效率与数据安全。 二、…

【Java 面试 八股文】Redis篇

Redis 1. 什么是缓存穿透&#xff1f;怎么解决&#xff1f;2. 你能介绍一下布隆过滤器吗&#xff1f;3. 什么是缓存击穿&#xff1f;怎么解决&#xff1f;4. 什么是缓存雪崩&#xff1f;怎么解决&#xff1f;5. redis做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&…

防火墙术语大全( Firewalld Glossary of Terms)

防火墙术语大全 防火墙作为网络安全中不可或缺的设备&#xff0c;在各种网络架构中扮演着至关重要的角色。无论是企业级防火墙、云防火墙还是家用路由器内置的防火墙&#xff0c;它们的工作原理和配置策略都离不开一系列专业术语的支撑。对于网络工程师来说&#xff0c;掌握这…

【蓝耘元生代智算云平台】一键部署 DeepSeek人工智能模型

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…

配置@别名路径,把@/ 解析为 src/

路径解析配置 webpack 安装 craco npm i -D craco/craco 项目根目录下创建文件 craco.config.js &#xff0c;内容如下 const path require(path) module.exports {webpack: {// 配置别名alias: {// 约定&#xff1a; 使用 表示src文件所在路径: path.resolve(__dirname,src)…