当前位置: 首页 > ds >正文

JavaScript中的XMLHttpRequest对象分析

        XMLHttpRequest(XHR)是JavaScript中用于客户端与服务器进行异步通信的核心API,它构成了现代Web应用无刷新数据交互的技术基础。作为AJAX技术的实现核心,XHR允许网页在不重新加载的情况下向服务器请求数据并更新部分页面内容,这种能力彻底改变了Web应用的交互模式。在典型应用中,XHR被广泛用于表单提交验证、实时搜索建议、无限滚动加载、数据仪表盘更新等场景,其readyState状态机机制和onreadystatechange事件处理模型为开发者提供了精细的请求生命周期控制。虽然XHR支持同步和异步两种模式,但出于用户体验考虑,现代开发几乎全部采用异步方式,配合JSON数据格式替代最初设计的XML,形成了当前主流的前后端分离架构基础。 

        随着Web技术的发展,XHR正逐渐被更现代的Fetch API所替代,后者基于Promise的链式调用提供了更简洁的语法和更强大的功能。不过由于XHR的广泛兼容性(包括对旧版IE的支持)和成熟的特性(如上传进度跟踪),它仍在许多遗留系统和特殊场景中保持重要地位。未来发展方向上,WebSocket、Server-Sent Events等实时通信协议将处理持续性连接需求,而Service Worker与Cache API则推动离线优先的渐进式Web应用,但XHR作为第一个实现浏览器端脚本自由通信的API,其设计理念仍深刻影响着后续所有Web通信标准的演进。在Web组件化、微前端架构兴起的当下,理解XHR的工作原理对于处理跨域请求、性能优化等进阶话题仍具有不可替代的价值。   

一、词源与历史背景

XMLHttpRequest (XHR) 对象名称由三部分组成:

  • XML‌:最初设计用于处理XML格式数据交换
  • Http‌:基于HTTP协议实现客户端-服务器通信
  • Request‌:核心功能是发起网络请求

该对象最早由微软在1999年IE5中作为ActiveX组件实现,后经标准化成为所有现代浏览器支持的API。虽然名称保留"XML",但实际可处理任何数据格式(JSON/HTML/文本等)。

二、核心功能

  1. 异步通信‌:不阻塞页面交互的情况下获取数据
  2. 局部更新‌:实现无刷新页面内容更新(AJAX核心)
  3. 协议支持‌:支持HTTP/HTTPS协议,部分浏览器支持file/ftp
  4. 数据格式‌:可发送/接收文本、二进制、FormData等多种格式

三、完整语法结构

var xhr = new XMLHttpRequest();
xhr.open(method, url, async, user, password);
xhr.send(data);

四、常用方法

1.open()方法

语法:

open(method, url[, async, user, password])

初始化请求参数:

  • method‌:HTTP方法(必须)
    • "GET":获取资源
    • "POST":提交数据
    • "PUT"/"DELETE"
  • url‌:请求地址(必须)
  • async‌:是否异步(可选,默认true)
    • true:异步(推荐)
    • false:同步(已废弃)
  • user/password‌:HTTP基础认证凭据(可选)

2.send()方法

语法:

send([body])

发送请求:

  • body‌:请求体内容(可选)
    • GET请求:通常为null
    • POST请求:可传String/FormData/Blob

3.setRequestHeader()方法

语法:

setRequestHeader(name, value)

设置请求头:

  • name‌:头部字段名(如"Content-Type"
  • value‌:字段值(如"application/json"

4. abort()方法

中止当前请求

5.overrideMimeType()方法

语法:

overrideMimeType(mimeType)

强制解析响应为指定MIME类型

五、常用属性

1. 状态属性

  • onreadystatechange:监听请求生命周期中的状态变化
  • readyState‌:请求状态(只读)
    • 0:未初始化(UNSENT)
    • 1:已打开(OPENED)
    • 2:已发送(HEADERS_RECEIVED)
    • 3:接收中(LOADING)
    • 4:完成(DONE)
  • status‌:HTTP状态码(如200/404)
  • statusText‌:状态文本(如"OK"/"Not Found")

2. 响应属性

  • responseText‌:文本形式响应内容
  • responseXML‌:XML格式响应(需正确Content-Type)
  • response‌:根据responseType返回对应类型数据
  • responseType‌:指定响应类型:
    • "":文本(默认)
    • "text":字符串
    • "json":自动解析为JSON
    • "document":XML文档
    • "blob":二进制数据
    • "arraybuffer":ArrayBuffer对象

3. 其他属性

  • timeout‌:请求超时时间(毫秒)
  • withCredentials‌:是否发送凭据(跨域请求)
  • upload‌:上传进度跟踪对象

六、XMLHttpRequest (XHR) 事件处理

基本事件列表

XHR对象提供了一系列事件用于监控请求状态变化:

onreadystatechange

  • 最基础的事件处理器
  • 每当readyState属性改变时触发
  • 需手动检查readyState和status值

onloadstart

  • 请求开始时触发
  • 表示请求流程已启动

onprogress

  • 数据传输过程中周期性触发
  • 可用于实现进度条功能

onabort

  • 请求被中止时触发
  • 调用abort()方法后会触发此事件

onerror

  • 请求失败时触发
  • 网络错误或跨域限制等情况会触发

onload

  • 请求成功完成时触发
  • 替代检查readyState==4的简化方式

ontimeout

  • 请求超时时触发
  • 需配合timeout属性使用

onloadend

  • 请求结束时触发(无论成功与否)
  • 总会最后触发的事件

上传专用事件

通过xhr.upload对象可监控上传进度:

upload.onprogress

  • 上传数据过程中周期性触发
  • 可用于显示上传进度条

upload.onloadstart

  • 上传开始时触发

upload.onabort

  • 上传被中止时触发

upload.onerror

  • 上传失败时触发

upload.onload

  • 上传成功完成时触发

upload.ontimeout

  • 上传超时时触发

upload.onloadend

  • 上传结束时触发(无论成功与否)

事件处理示例代码

const xhr = new XMLHttpRequest();
xhr.open('GET', 'api/data', true);// 基础事件处理
xhr.onloadstart = () => console.log('请求开始');
xhr.onprogress = (e) => {if(e.lengthComputable) {console.log(`已接收 ${e.loaded} / ${e.total} 字节`);}
};
xhr.onload = () => console.log('请求完成', xhr.response);
xhr.onerror = () => console.error('请求失败');// 上传事件处理
xhr.upload.onprogress = (e) => {if(e.lengthComputable) {console.log(`已上传 ${e.loaded} / ${e.total} 字节`);}
};xhr.send();

事件触发顺序

典型请求的事件触发顺序为:

  1. loadstart
  2. progress (可能多次)
  3. load/error/abort/timeout (四者之一)
  4. loadend6

最佳实践建议

  1. 优先使用onload而非onreadystatechange简化代码
  2. 大文件传输时利用progress事件更新UI
  3. 超时处理应结合ontimeout和timeout属性
  4. 错误处理应同时考虑onerror和status检查
  5. 跨域请求需注意CORS相关错误处理

七、完整示例

1. GET请求示例

var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true);
xhr.onload = function() {if(xhr.status === 200) {console.log(JSON.parse(xhr.responseText));}
};
xhr.send();

2. POST请求示例

var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.example.com/submit', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function() {if(xhr.readyState === 4) {alert(xhr.status === 201 ? '成功' : '错误: '+xhr.status);}
};
xhr.send(JSON.stringify({name: "John", age: 30}));

八、XMLHttpRequest (XHR) 浏览器兼容性详解

核心兼容性列表

1. 基础支持情况

浏览器/版本支持情况特殊限制
IE6/IE7不支持原生XHR,需使用ActiveXObject("Microsoft.XMLHTTP")仅同步请求
IE8/IE9完全不支持XHR对象-
IE10/IE11部分支持不支持xhr.responseType为json
Chrome/Firefox/Safari/Edge完全支持-
Opera Mini完全不支持-

2. 高级特性支持

特性兼容情况受影响浏览器
responseType=json部分支持IE10/IE11不支持
responseType=blob部分支持旧版移动浏览器可能不支持
timeout属性部分支持某些旧版浏览器不支持
upload属性现代浏览器支持IE9及以下不支持
CORS跨域请求需服务器配合所有浏览器需配置Access-Control-Allow-Origin

3. 事件支持差异

事件类型兼容性备注
onreadystatechange全支持基础事件
onprogress/upload.onprogressIE10+旧IE不支持
ontimeout部分支持依赖timeout属性支持
onerror全支持实现细节可能不同
onload/onloadendIE9+更现代的替代方案

兼容性解决方案

1. 创建兼容的XHR对象

function createXHR() {if (window.XMLHttpRequest) {return new XMLHttpRequest(); // 标准浏览器}try {return new ActiveXObject("Msxml2.XMLHTTP"); // IE6+} catch(e) {try {return new ActiveXObject("Microsoft.XMLHTTP"); // IE5} catch(e) {throw new Error("浏览器不支持XHR");}}
}:ml-citation{ref="7" data="citationList"}

2. 特性检测方案

// 检测超时支持
const supportsTimeout = 'timeout' in new XMLHttpRequest();// 检测responseType支持
const xhr = new XMLHttpRequest();
xhr.responseType = 'json';
const supportsJSON = xhr.responseType === 'json';:ml-citation{ref="9" data="citationList"}

现代浏览器注意事项

  1. CORS限制‌:所有现代浏览器严格执行同源策略,跨域请求需服务器设置Access-Control-Allow-Origin
  2. HTTPS要求‌:现代浏览器对混合内容(XHR从HTTPS页面向HTTP地址请求)会阻止或警告
  3. 隐私限制‌:Safari等浏览器对第三方cookie的限制会影响withCredentials的使用

推荐替代方案

  1. Fetch API‌:更现代的替代方案,但IE完全不支持
  2. Axios‌:基于XHR的封装,处理了大部分兼容性问题
  3. jQuery.ajax‌:兼容旧浏览器的封装方案

移动端特殊考虑

  1. iOS Safari‌:对并发请求数有限制(同一域名最多6个)
  2. Android WebView‌:可能禁用XHR,需特殊配置
  3. 省电模式‌:可能限制后台XHR请求

九、XMLHttpRequest (XHR) 的现代替代方案

主要替代方案

1. Fetch API

  • 特点‌:
    • 基于Promise的现代化API设计
    • 更简洁的语法结构
    • 原生支持流式数据处理
    • 自动处理简单的CORS请求
  • 优势‌:
    • 符合职责分离原则
    • 与async/await完美配合
    • 内置JSON解析功能
  • 局限性‌:
    • 默认不会拒绝HTTP错误状态(404/500等)
    • 不支持请求取消(需使用AbortController)
    • 进度监控不如XHR完善

2. Axios

  • 特点‌:
    • 基于Promise的HTTP客户端
    • 同时支持浏览器和Node.js环境
    • 自动转换JSON数据
    • 提供请求/响应拦截器
  • 优势‌:
    • 完善的错误处理机制
    • 支持请求取消
    • 内置XSRF防御
    • 更丰富的配置选项
  • 局限性‌:
    • 需要额外引入库
    • 相比Fetch API体积更大

3. GraphQL客户端(Apollo/Relay)

  • 特点‌:
    • 基于GraphQL查询语言
    • 精确获取所需数据
    • 单一端点处理所有请求
    • 强大的类型系统
  • 优势‌:
    • 减少网络请求次数
    • 避免数据过度获取
    • 前端驱动数据需求
  • 局限性‌:
    • 需要后端支持GraphQL
    • 学习曲线较陡

功能对比表

特性XHRFetch APIAxiosGraphQL
Promise支持不支持支持支持支持
请求取消支持需扩展支持支持
进度监控完善有限完善有限
拦截器不支持不支持支持支持
自动JSON转换不支持支持支持支持
跨域处理需配置自动自动自动
浏览器支持广泛现代广泛现代
体积大小原生原生较大较大

迁移建议

  1. 简单项目‌:优先考虑Fetch API,减少依赖
  2. 企业级应用‌:推荐Axios,功能更全面
  3. 数据密集型应用‌:考虑GraphQL方案
  4. 兼容旧浏览器‌:仍需要XHR或Axios

代码示例对比

Fetch API基本用法

fetch('https://api.example.com/data').then(response => {if(!response.ok) throw new Error('Network response was not ok');return response.json();}).then(data => console.log(data)).catch(error => console.error('Error:', error));

Axios基本用法

axios.get('https://api.example.com/data').then(response => console.log(response.data)).catch(error => console.error('Error:', error));

这两种现代方案都比传统XHR代码更简洁易读。

十、open() 方法深度解析

(一)功能定位

XMLHttpRequest.open() 方法名称来源于其核心功能组合:

  • XML‌:反映其最初设计用于处理XML数据交换
  • Http‌:表明其基于HTTP协议通信的本质
  • Request‌:标识其作为请求发起者的角色
  • open‌:描述其初始化网络连接的动作(与TCP层的"打开连接"概念对应)

该方法用于初始化HTTP请求,建立客户端与服务器的通信通道,但不实际发送数据。其功能定位是AJAX技术的核心基础,实现浏览器与服务器间的异步数据交换。

(二)语法结构

完整方法签名:

void open(DOMString method, DOMString url, optional boolean async, optional DOMString user, optional DOMString password
);

(三)参数逐项解析

1. method (必需)

取值与含义‌:

语义典型场景
GET获取服务器资源读取数据、搜索查询
POST提交数据到服务器表单提交、创建资源
PUT替换目标资源完整更新已有资源
DELETE删除指定资源移除服务器数据
HEAD获取响应头信息检查资源是否存在或验证缓存
PATCH部分修改资源局部更新字段
OPTIONS获取服务器支持的通信选项CORS预检请求

特殊说明‌:

  • 不区分大小写但规范推荐大写
  • 非法方法名(如含空格)会抛出SyntaxError

2. url (必需)

格式要求‌:

  • 绝对URL:https://api.example.com/data
  • 相对URL:/api/users?id=123
  • 支持协议:HTTP/HTTPS(主流)、file://和FTP(部分浏览器)

同源策略限制‌:

graph TDA[当前页面] -->|协议相同| B[目标URL]A -->|域名相同| BA -->|端口相同| BB --> C[允许请求]

特殊处理‌:

  • 跨域请求需服务器配置CORS响应头
  • URL中的查询参数需正确编码(如空格转为%20)

3. async (可选)

行为对比‌:

模式默认值执行特点适用场景
true异步执行,不阻塞JS线程99%的Web应用场景
false同步执行,阻塞直至响应返回Web Worker等特殊环境

风险提示‌:

  • 同步模式会导致UI冻结(现代浏览器会在控制台显示警告)
  • 主线程中同步XHR已被废弃

4. user (可选)

认证机制‌:

// 两种等效写法
xhr.open('GET', 'https://admin:pass@api.com', true);
xhr.open('GET', 'https://api.com', true, 'admin', 'pass');  // 优先使用:ml-citation{ref="3" data="citationList"}

安全注意‌:

  • 密码明文传输,必须配合HTTPS使用
  • 优先使用OAuth等现代认证方案

5. password (可选)

  • 必须与user参数配对使用
  • 空密码应传空字符串而非null

(四)方法示例与输出

1、基础GET请求

const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/products');
xhr.send();

输出流程‌:

  1. 初始化XHR对象(readyState=0)
  2. open()调用后(readyState=1)
  3. 网络层建立TCP连接
  4. 服务器返回响应后触发回调

2、完整POST示例

const xhr = new XMLHttpRequest();
xhr.open('POST', '/api/orders', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onload = () => {if(xhr.status === 201) {console.log(JSON.parse(xhr.responseText));}
};
xhr.send(JSON.stringify({ product: "book", qty: 2 }));

(五)应用场景分析

1. 传统AJAX应用

sequenceDiagram前端->>+服务器: GET /data服务器-->>-前端: JSON响应前端->>DOM: 局部更新

2. 文件上传监控

xhr.upload.onprogress = (e) => {const percent = Math.round((e.loaded / e.total) * 100);progressBar.value = percent;
};

3. 长轮询实现

function longPoll() {xhr.open('GET', '/messages');xhr.onload = () => {processMessages(xhr.response);longPoll();  // 递归调用};xhr.send();
}

(六)注意事项

调用顺序‌:

  • 必须在send()前调用
  • setRequestHeader()必须在open之后

状态重置‌:

  • 每次open()会重置之前的请求头和响应数据

错误处理‌:

xhr.onerror = () => {console.error('Network failure');
};

超时设置‌:

xhr.timeout = 5000;  // 5秒超时
xhr.ontimeout = () => {...};

(七)综合比较表

特性XHR open()fetch()
基本语法参数分散集中配置对象
异步控制显式async参数始终异步
认证支持内置user/password参数需通过headers配置
请求取消支持xhr.abort()使用AbortController
进度监控完备的progress事件需自行实现
浏览器兼容性IE7+IE不支持
默认行为需手动设置请求头自动处理部分头信息

(八)底层机制深度解析

网络层交互‌:

  • 调用open()时创建HTTP请求模板
  • 实际TCP连接在send()时建立

状态机转换‌:

stateDiagram-v2[*] --> UNSENTUNSENT --> OPENED: open()OPENED --> HEADERS_RECEIVED: send()HEADERS_RECEIVED --> LOADING: 接收数据LOADING --> DONE: 完成

性能优化建议‌:

  • 复用XHR对象减少内存分配
  • 避免同步请求阻塞主线程
  • 合理设置超时时间

(九)现代替代方案

虽然Fetch API逐渐成为主流,但XHR仍在以下场景具有优势:

  • 需要上传进度监控
  • 兼容老旧浏览器
  • 需要中止请求(abort)
  • 处理超时控制

通过全面理解open()方法的各个细节,开发者可以更精准地控制网络请求行为,构建健壮的Web应用程序。

十一、send() 方法深度解析

(一)功能定位

send() 方法名称源自其核心功能:

  • send‌(发送):体现其将客户端请求数据传输至服务器的动作本质
  • 词源可追溯至TCP/IP协议中的"send packet"概念,反映底层网络传输行为

该方法用于实际发起HTTP请求,将open()方法初始化的请求发送到服务器,是XHR通信流程中的关键执行环节。

(二)语法结构

完整方法签名:

void send(optional (Document or BodyInit)? body = null);

(三)参数解析

1、body (可选)

取值与语义‌:

值类型适用场景示例
null/undefinedGET/HEAD请求xhr.send()
DocumentXML文档传输xhr.send(xmlDoc)
Blob二进制文件上传xhr.send(fileBlob)
ArrayBuffer原始二进制数据xhr.send(buffer)
FormData表单数据/文件上传xhr.send(formData)
URLSearchParamsURL编码的键值对xhr.send(new URLSearchParams(...))
String普通文本数据xhr.send(JSON.stringify(data))

特殊说明‌:

  • GET请求必须传入null或省略参数(部分旧版浏览器要求显式传null
  • POST请求体需配合setRequestHeader()设置Content-Type

(四)方法示例与输出

1、基础GET请求

const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/data');
xhr.onload = () => console.log(xhr.responseText);
xhr.send();  // 等效于xhr.send(null)

输出流程‌:

  1. 建立TCP连接(readyState=1)
  2. 发送空请求体(无body)
  3. 接收响应后触发onload(readyState=4)

完整POST示例

const xhr = new XMLHttpRequest();
xhr.open('POST', '/api/submit');
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function() {if(xhr.readyState === 4 && xhr.status === 200) {console.log('响应数据:', xhr.response);}
};
xhr.send(JSON.stringify({ id: 123, name: "测试" }));

输出结果‌:

  • 成功:返回服务器处理后的JSON响应
  • 失败:触发onerror事件

(五)应用场景分析

1. 表单数据提交

const formData = new FormData(document.getElementById('myForm'));
xhr.open('POST', '/submit');
xhr.send(formData);  // 自动设置multipart/form-data:ml-citation{ref="8" data="citationList"}

2. 文件上传进度监控

xhr.upload.onprogress = (e) => {const percent = (e.loaded / e.total * 100).toFixed(2);console.log(`上传进度: ${percent}%`);
};
xhr.open('POST', '/upload');
xhr.send(file);:ml-citation{ref="2,9" data="citationList"}

3. 大文件分块传输

const chunk = file.slice(offset, offset + CHUNK_SIZE);
xhr.open('POST', `/upload?name=${file.name}&offset=${offset}`);
xhr.send(chunk);:ml-citation{ref="9" data="citationList"}

(六)注意事项

调用顺序‌:

  • 必须在open()之后调用
  • 重复调用会触发InvalidStateError

同步请求限制‌:

  • 主线程同步调用会导致UI冻结(现代浏览器已废弃该特性)

超时处理‌:

xhr.timeout = 5000;  // 5秒超时
xhr.ontimeout = () => console.error('请求超时');:ml-citation{ref="5" data="citationList"}

安全限制‌:

  • 跨域请求需服务器配置CORS
  • 禁止修改敏感请求头(如Cookie、Host等)

(七)综合比较表

特性XHR send()fetch() body
数据格式支持支持所有BodyInit类型同左
进度监控完备的upload事件需手动实现
请求中止支持abort()需AbortController
默认Content-Typetext/plain自动根据body类型设置
流式传输
支持
支持ReadableStream
错误处理需手动检查status自动拒绝网络错误
浏览器兼容性IE7+不兼容IE

(八)底层机制

网络层行为‌:

  • 调用时创建HTTP请求报文
  • 对非简单请求触发CORS预检

状态机转换‌:

stateDiagram-v2OPENED --> HEADERS_RECEIVED: send()HEADERS_RECEIVED --> LOADING: 接收响应头LOADING --> DONE: 接收完成

性能优化‌:

  • 复用XHR对象减少TCP握手开销
  • 大文件使用分块传输

(九)现代替代方案

Fetch API等效实现

// 对应xhr.send(JSON.stringify(data))
fetch('/api', {method: 'POST',body: JSON.stringify(data),headers: { 'Content-Type': 'application/json' }
});:ml-citation{ref="10,11" data="citationList"}

(十)异常处理指南

网络错误‌:

xhr.onerror = () => console.error('网络连接失败');

状态码检查‌:

if(xhr.status >= 400) {console.error(`请求失败: ${xhr.statusText}`);
}:ml-citation{ref="4,7" data="citationList"}

超时处理‌:

xhr.ontimeout = () => retryRequest();

通过全面掌握send()方法的特性和使用模式,开发者可以构建更健壮的异步通信系统,满足现代Web应用的数据交互需求。

十二、setRequestHeader() 方法深度解析

(一)词源与功能定位

setRequestHeader() 方法名称由三部分构成:

  • set‌(设置):表明其配置属性的功能本质
  • Request‌(请求):限定操作对象为HTTP请求
  • Header‌(头部):指定操作目标是HTTP报文头部字段

该方法用于在发送HTTP请求前设置自定义请求头信息,是XHR实现精细化请求控制的核心手段。

(二)语法结构

完整方法签名:

void setRequestHeader(DOMString name, DOMString value);

(三)参数解析

1. name (必需)

取值规则‌:

  • 标准HTTP头字段名(不区分大小写):
    • Content-TypeAuthorizationAccept
  • 自定义头字段名(建议X-前缀):
    • X-Requested-WithX-CSRF-Token

特殊限制‌:

     禁止设置以下浏览器管控头字段:

Host, Connection, Keep-Alive, Accept-Encoding, etc.

2. value (必需)

格式要求‌:

  •       字符串类型(非字符串会自动转换)
  •       多值头字段使用逗号分隔:
xhr.setRequestHeader('Accept', 'text/html,application/xhtml+xml');

(四)方法示例与输出

1、基础JSON请求

const xhr = new XMLHttpRequest();
xhr.open('POST', '/api');
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader('X-Request-ID', uuidv4());
xhr.send(JSON.stringify(data));

输出效果‌:

POST /api HTTP/1.1
Content-Type: application/json
X-Request-ID: 550e8400-e29b-41d4-a716-446655440000

2、身份认证示例

xhr.setRequestHeader('Authorization', 'Bearer ' + token);
xhr.setRequestHeader('X-Api-Version', '1.0');

(五)应用场景分析

1. 内容协商

// 指定可接受的响应格式
xhr.setRequestHeader('Accept', 'application/vnd.api+json');

2. CSRF防护

// 设置CSRF令牌
xhr.setRequestHeader('X-CSRF-Token', getCSRFToken());

3. 版本控制

// API版本标识
xhr.setRequestHeader('X-API-Version', '2.1');

(六)注意事项

调用时机‌:

  • 必须在open()之后、send()之前调用
  • 重复设置同名字段会追加而非覆盖

跨域限制‌:

  • 非简单请求会触发CORS预检
  • 需服务器配置Access-Control-Allow-Headers

敏感头限制‌:

// 以下设置无效且可能报错
xhr.setRequestHeader('Host', 'malicious.com');

(七)综合比较表

特性setRequestHeader()fetch() headers
调用方式链式单独设置构造时整体配置
值类型自动转为字符串支持多种类型
多值处理逗号分隔数组形式
默认头包含基础头
浏览器管控头禁止设置部分允许
错误反馈静默失败明确异常

(八)底层机制

头部合并流程‌:

graph LRA[open()初始化] --> B[setRequestHeader添加]B --> C[浏览器添加默认头]C --> D[生成最终请求头]

CORS预检触发条件‌:

  • 自定义非安全头字段
  • text/plain的Content-Type

(九)现代替代方案

Fetch API等效实现

fetch('/api', {headers: {'Content-Type': 'application/json','X-Custom-Header': 'value'}
});

(十)安全最佳实践

敏感信息处理‌:

  • 认证令牌需配合HTTPS传输
  • 避免在头中传输明文密码

防御性编程‌:

try {xhr.setRequestHeader('X-Sensitive', encrypt(data));
} catch(e) {console.error('头设置失败:', e);
}

通过深入理解setRequestHeader()的运作机制,开发者可以实现更安全、更灵活的HTTP通信控制。

十三、abort() 方法深度解析

(一)词源分解与功能定位

abort() 方法名称源自其核心功能:

  • abort‌(中止):源自拉丁语"abortus",意为"终止进程"
  • 在计算机领域特指"异常终止程序或操作"的行为

该方法用于强制终止正在进行的XHR请求,是控制异步通信流程的关键安全机制。

(二)语法结构

基础语法:

void abort();

无参数,无返回值。

(三)执行效果

调用后触发以下行为:

  1. 立即终止网络传输
  2. 将readyState置为0(UNSENT)
  3. 触发onabort事件
  4. 释放相关网络资源

(四)方法示例

基础使用

const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/large-data');
xhr.send();// 用户取消操作时调用
document.getElementById('cancel').onclick = () => {xhr.abort();console.log('请求已取消');
};

完整生命周期控制

const xhr = new XMLHttpRequest();
let isAborted = false;xhr.open('GET', '/api/data');
xhr.onload = () => {if(!isAborted) console.log(xhr.response);
};
xhr.onabort = () => {isAborted = true;console.warn('请求被主动中止');
};
xhr.send();// 超时自动中止
setTimeout(() => {xhr.abort();
}, 5000);

(五)应用场景

1. 用户主动取消

// 搜索建议场景
let searchXHR;searchInput.oninput = () => {if(searchXHR) searchXHR.abort();searchXHR = new XMLHttpRequest();searchXHR.open('GET', `/search?q=${searchInput.value}`);searchXHR.send();
};

2. 竞态条件处理

// 选项卡切换场景
let currentXHR;function loadTab(tabId) {if(currentXHR) currentXHR.abort();currentXHR = new XMLHttpRequest();currentXHR.open('GET', `/tabs/${tabId}`);currentXHR.onload = () => updateUI(currentXHR.response);currentXHR.send();
}

3. 超时控制

xhr.timeout = 3000;
xhr.ontimeout = () => {xhr.abort();showTimeoutMessage();
};

(六)注意事项

资源释放‌:

  • 中止后应解除对XHR对象的引用
  • 避免重用已中止的XHR实例

事件触发顺序‌:

sequenceDiagramUser->>XHR: abort()XHR->>XHR: readyState=0XHR->>Document: onabortXHR->>Network: 释放连接

兼容性问题‌:

  • IE10+完全支持
  • 旧版IE可能需额外错误处理

(七)综合比较表

特性XHR abort()Fetch AbortController
调用方式实例方法通过signal控制
错误反馈触发onabort抛出AbortError异常
多请求控制需单独管理每个XHR单个controller控制多请求
浏览器支持IE10+现代浏览器
内存管理需手动释放引用自动垃圾回收
中止时机任何阶段同左

(八)底层机制

网络层行为‌:

  • 发送TCP RST包终止连接
  • 清除浏览器内部请求队列

性能影响‌:

  • 过早中止可能浪费已传输数据
  • 合理使用可降低服务器负载

(九)现代替代方案

Fetch API + AbortController

const controller = new AbortController();
fetch('/api', { signal: controller.signal }).catch(e => {if(e.name === 'AbortError') console.log('请求中止');});// 中止请求
controller.abort();

(十)错误处理最佳实践

状态检测‌:

xhr.onabort = () => {if(xhr.readyState !== 4) {showUserMessage('请求已取消');}
};

重试机制‌:

let retryCount = 0;function fetchWithRetry() {const xhr = new XMLHttpRequest();xhr.onabort = () => {if(retryCount++ < 3) fetchWithRetry();};xhr.open('GET', url);xhr.send();
}

通过合理运用abort()方法,开发者可以构建更健壮的前端通信系统,有效管理网络资源并提升用户体验。

十四、overrideMimeType() 方法深度解析

(一)词源分解与功能定位

overrideMimeType() 方法名称由三部分构成:

  • override‌(重写):源自英语"over"(覆盖)+"ride"(驾驭),表示强制修改默认行为
  • MIME‌(多用途互联网邮件扩展):Multipurpose Internet Mail Extensions的缩写
  • Type‌(类型):指定数据格式类别

该方法用于强制修改服务器返回的MIME类型标识,使浏览器按指定方式处理响应数据。

(二)语法结构

基础语法:

void overrideMimeType(DOMString mimeType);

单参数,无返回值。

(三)参数详解

mimeType (必需)

格式要求‌:

  • 标准MIME类型字符串
  • 可包含字符集参数

常用取值‌:

类型值应用场景
text/plain原始文本处理
text/xml强制XML解析
application/jsonJSON数据处理
text/htmlHTML文档解析
image/svg+xmlSVG图像处理
text/plain;charset=ISO-8859-1指定字符集

(四)方法示例与输出

基础使用

const xhr = new XMLHttpRequest();
xhr.open('get', '/server', true);
xhr.overrideMimeType('text/plain');
xhr.onload = () => console.log(xhr.responseText);
xhr.send();

执行效果‌:

  1. 忽略服务器返回的Content-Type头
  2. 强制按纯文本处理响应数据
  3. 原始响应数据可通过responseText获取

字符集转换

xhr.overrideMimeType('text/xml; charset=gbk');

特殊说明‌:

  • 需确保实际编码与声明一致
  • 错误设置会导致乱码

(五)应用场景分析

1. 错误MIME类型修正

// 服务器误报text/xml但实际为JSON
xhr.overrideMimeType('application/json');
xhr.onload = () => {const data = JSON.parse(xhr.responseText);
};

2. 原始数据获取

// 绕过浏览器自动解析
xhr.overrideMimeType('text/plain');
xhr.onload = () => {const rawData = xhr.responseText;// 自定义处理逻辑
};

3. 特殊编码处理

// 处理GBK编码响应
xhr.overrideMimeType('text/html; charset=gbk');

(六)注意事项

调用时机‌:

  • 必须在open()之后、send()之前调用
  • 过早调用会抛出InvalidStateError

性能影响‌:

  • 禁用浏览器内置解析器可能增加处理开销
  • 不当使用会导致二次解析浪费资源

兼容性问题‌:

  • IE10+完全支持
  • 旧版IE需特殊处理

(七)综合比较表

特性overrideMimeType()responseType
作用对象响应头Content-Type响应体处理方式
生效阶段网络层应用层
数据类型支持文本类MIME二进制/文本皆可
字符集控制支持指定不支持
浏览器支持IE10+IE10+
典型应用修正错误MIME类型处理二进制数据

(八)底层机制

HTTP协议交互‌:

sequenceDiagramClient->>Server: 请求资源Server->>Client: 返回响应(可能含错误Content-Type)Client->>Client: overrideMimeType生效Client->>DOM: 按新MIME类型处理数据

数据处理流程‌:

  • 原始响应 → MIME类型重写 → 浏览器处理管道 → 应用层访问

(九)现代替代方案

Fetch API等效实现

fetch('/api').then(res => res.blob()) // 或.text()/.json().then(data => console.log(data));

(十)错误处理实践

安全校验‌:

try {xhr.overrideMimeType('text/xml');
} catch(e) {console.error('MIME类型设置失败:', e);
}

类型验证‌:

xhr.onload = () => {if(!isValidXML(xhr.responseText)) {throw new Error('数据格式异常');}
};

通过合理运用overrideMimeType(),开发者可以更灵活地控制数据解析过程,处理各种非标准服务器响应场景。

十五、onreadystatechange 属性深度解析

(一)词源分解与功能定位

onreadystatechange 属性名称由三部分构成:

  • on‌:表示事件监听的前缀
  • readyState‌:请求状态标识
  • change‌:状态变化事件

该属性是XHR对象的核心事件处理器,用于监听请求生命周期中的状态变化。

(二)语法结构

基础定义方式:

xhr.onreadystatechange = function() {// 状态变化处理逻辑
};

或事件监听器方式:

xhr.addEventListener('readystatechange', function() {// 事件处理逻辑
});

(三)触发机制

触发条件执行时机典型处理场景
readyState变化每次状态变更时状态0→1、1→2等过渡阶段
包括abort()调用中止请求时资源释放处理
网络错误传输异常时错误恢复机制

(四)属性示例与输出

基础监控示例

const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/data', true);xhr.onreadystatechange = function() {console.log(`当前状态: ${xhr.readyState}`);if(xhr.readyState === 4) {console.log('最终状态码:', xhr.status);}
};xhr.send();

典型输出序列‌:

当前状态: 1
当前状态: 2
当前状态: 3
当前状态: 4
最终状态码: 200

(五)应用场景分析

1. 渐进式数据处理

xhr.onreadystatechange = function() {if(xhr.readyState === 3) {processChunk(xhr.responseText); }
};

2. 请求超时控制

const timeout = setTimeout(() => {if(xhr.readyState < 4) {xhr.abort();showTimeoutUI();}
}, 5000);

3. 多阶段验证

xhr.onreadystatechange = function() {switch(xhr.readyState) {case 2:validateHeaders(xhr.getAllResponseHeaders());break;case 4:if(xhr.status === 200) {updateDOM(xhr.responseText);}break;}
};

(六)注意事项

执行上下文‌:

  • 处理函数内的this指向XHR实例
  • 箭头函数会改变this绑定

事件触发频率‌:

graph TDA[UNSENT] -->|open()| B[OPENED]B -->|send()| C[HEADERS_RECEIVED]C --> D[LOADING]D --> E[DONE]style A fill:#f9f,stroke:#333style E fill:#bbf,stroke:#f66

内存管理‌:

  • 长期未完成的请求需手动解除引用
  • 避免在单页应用中产生僵尸监听器

(七)综合比较表

特性onreadystatechangeonloadonprogress
触发粒度所有状态变化(5次)仅完成时(1次)数据传输时(多次)
适用阶段全生命周期最终完成阶段数据传输阶段
二进制支持需配合responseType原生支持原生支持
错误捕获需手动检查status自动触发不适用
浏览器兼容性IE7+IE9+IE10+

(八)现代替代方案

Fetch API + AbortController

const controller = new AbortController();
fetch('/api', { signal: controller.signal }).then(res => res.json()).catch(e => {if(e.name === 'AbortError') console.log('请求中止');});

(九)性能优化建议

条件执行优化‌:

// 推荐:仅处理完成状态
if(xhr.readyState === 4) {// 核心处理逻辑
}

事件委托‌:

const handler = function() {if(this.readyState === 4) {// 处理逻辑this.removeEventListener('readystatechange', handler);}
};
xhr.addEventListener('readystatechange', handler);

错误防御‌:

xhr.onreadystatechange = function() {try {if(this.readyState === 4 && this.status === 200) {JSON.parse(this.responseText);}} catch(e) {console.error('数据处理异常:', e);}
};

通过合理运用onreadystatechange机制,开发者可以实现精细化的异步请求控制,构建更健壮的Web通信系统。

十六、readyState 属性深度解析

(一)词源分解与功能定位

readyState 属性名称由两部分构成:

  • ready‌(就绪):表示请求/响应过程的准备状态
  • State‌(状态):描述当前所处的阶段

该属性是XMLHttpRequest对象的核心状态指示器,用于精确追踪异步请求的生命周期。

(二)语法结构

基础访问方式:

const state = xhr.readyState;

属性特征:

  • 只读属性(unsigned short类型)
  • 动态变化值(0-4整数)
  • 无参数,无方法调用

(三)状态值详解

常量名含义典型触发时机
0UNSENT请求未初始化刚创建XHR对象时
1OPENED连接已建立调用open()方法后
2HEADERS_RECEIVED请求已接收收到响应头信息
3LOADING请求处理中接收响应体数据时
4DONE请求已完成全部数据接收完毕

(四)属性示例与输出

基础监控示例

const xhr = new XMLHttpRequest();
console.log(xhr.readyState); // 输出: 0 (UNSENT)xhr.open('GET', '/api/data', true);
console.log(xhr.readyState); // 输出: 1 (OPENED)xhr.onreadystatechange = function() {console.log(`状态变更: ${xhr.readyState}`);if(xhr.readyState === 4 && xhr.status === 200) {console.log('最终数据:', xhr.responseText);}
};
xhr.send();

典型输出序列‌:

0
1
2
3
4
最终数据: {...}

(五)应用场景分析

1. 渐进式数据加载

xhr.onreadystatechange = function() {if(xhr.readyState === 3) {updateProgress(xhr.responseText.length);}
};

2. 请求超时处理

let timer = setTimeout(() => {if(xhr.readyState < 4) {xhr.abort();showTimeoutMessage();}
}, 5000);

3. 多阶段处理

xhr.onreadystatechange = function() {switch(xhr.readyState) {case 2:validateHeaders(xhr.getAllResponseHeaders());break;case 4:processFinalData(xhr.response);break;}
};

(六)注意事项

事件监听机制‌:

  • onreadystatechange 在每次状态变化时触发
  • 现代API推荐使用addEventListener方式

状态变化时序‌:

graph LRA[0:UNSENT] -->|open()| B[1:OPENED]B -->|send()| C[2:HEADERS_RECEIVED]C --> D[3:LOADING]D --> E[4:DONE]

兼容性差异‌:

  • IE可能在某些中间状态触发额外事件
  • 部分浏览器对状态3的支持不一致

(七)综合比较表

特性readyStatefetch()状态机制
状态粒度5个精细阶段3个基本阶段
访问方式属性监听Promise链式调用
中间状态控制支持(状态3)不支持
二进制支持需配合responseType原生支持
错误处理需手动检查status自动捕获异常
浏览器支持全兼容现代浏览器

(八)现代替代方案

Fetch API状态监测

fetch('/api').then(res => {if(!res.ok) throw new Error(res.statusText);return res.json();}).then(data => console.log(data));

(九)性能优化建议

状态检测精简‌:

// 推荐:仅检查完成状态
if(xhr.readyState === 4) {// 处理逻辑
}

资源释放‌:

xhr.onloadend = function() {xhr = null; // 解除引用
};

错误防御‌:

xhr.onreadystatechange = function() {try {if(xhr.readyState === 4) {if(xhr.status >= 200 && xhr.status < 300) {// 成功处理}}} catch(e) {console.error('状态处理异常:', e);}
};

通过深入理解readyState机制,开发者可以构建更健壮的异步通信系统,实现精细化的请求过程控制和用户体验优化。

十七、status 属性深度解析

(一)词源分解与功能定位

status 属性名称源自HTTP协议状态码体系:

  • status‌(状态):表示HTTP请求/响应的处理结果
  • 数值型标识:采用3位数字编码规范(RFC 2616标准)

该属性是XHR对象的核心响应标识,用于精确判断服务器对请求的处理结果。

(二)语法结构

基础访问方式:

const httpStatus = xhr.status;

属性特征:

  • 只读属性(unsigned short类型)
  • 标准HTTP状态码(100-599)
  • 请求未完成时值为0

(三)状态码分类详解

1xx 信息类

代码文本含义
100Continue客户端应继续发送请求体
101Switching Protocols服务器同意协议升级

2xx 成功类

代码文本含义
200OK标准成功响应
201Created资源创建成功
204No Content响应无内容主体

3xx 重定向类

代码文本含义
301Moved Permanently永久重定向
302Found临时重定向
304Not Modified缓存有效

4xx 客户端错误

代码文本含义
400Bad Request请求语法错误
401Unauthorized需要认证
403Forbidden服务器拒绝执行
404Not Found资源不存在

5xx 服务端错误

代码文本含义
500Internal Server Error服务器内部错误
503Service Unavailable服务不可用

(四)属性示例与输出

基础检测示例

const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/data', true);
xhr.onload = function() {console.log(`状态码: ${xhr.status}`);if(xhr.status === 200) {console.log('响应数据:', xhr.responseText);}
};
xhr.send();

典型输出‌:

状态码: 200
响应数据: {...}

(五)应用场景分析

1. 错误分级处理

xhr.onreadystatechange = function() {if(xhr.readyState === 4) {switch(Math.floor(xhr.status/100)) {case 2: successHandler(xhr.response); break;case 4: clientErrorHandler(xhr.status); break;case 5: serverErrorHandler(); break;}}
};

2. 缓存验证

if(xhr.status === 304) {loadFromCache();
} else {updateCache(xhr.response);
}

3. 认证流程

if(xhr.status === 401) {showLoginModal();storePendingRequest(xhr);
}

(六)注意事项

时序问题‌:

  • 必须在readyState=4时检查status
  • 早期状态读取会得到0值

跨域限制‌:

  • 跨域请求仅能获取基本状态码(200/404等)
  • 详细状态信息受同源策略限制

特殊状态‌:

graph LRA[0:未发送] --> B[2xx:成功]A --> C[3xx:重定向]A --> D[4xx:客户端错误]A --> E[5xx:服务端错误]style A fill:#f9f,stroke:#333style B fill:#9f9,stroke:#090

(七)综合比较表

特性statusstatusTextreadyState
数据类型数值字符串数值
主要用途结果判断辅助说明阶段追踪
可靠度浏览器实现差异大
跨域可见性部分受限完全受限完全可见
现代替代方案Fetch的Response.statusResponse.statusTextPromise状态

(八)现代替代方案

Fetch API状态处理

fetch('/api').then(res => {console.log(res.status);  // 等效status属性if(!res.ok) throw new Error(res.statusText);return res.json();});

(九)性能优化建议

状态检测优化‌:

// 推荐:结合readyState检测
if(xhr.readyState === 4 && xhr.status === 200) {// 处理逻辑
}

错误防御‌:

try {if(xhr.status >= 400) {handleError(xhr.statusText); }
} catch(e) {console.error('状态处理异常:', e);
}

缓存策略‌:

if(xhr.status === 304) {useCachedVersion();
} else if(xhr.status === 200) {refreshCache(xhr.response);
}

通过深入理解status机制,开发者可以构建更健壮的HTTP通信系统,实现精确的错误处理和用户体验优化。

十八、statusText 属性深度解析

(一)词源分解与功能定位

statusText 属性名称由两部分构成:

  • status‌:表示HTTP请求的状态
  • Text‌:文本形式的描述信息

该属性是XHR对象的核心响应描述符,用于获取服务器返回的HTTP状态码对应的文本描述。

(二)语法结构

基础访问方式:

const statusDescription = xhr.statusText;

属性特征:

  • 只读属性(DOMString类型)
  • 标准HTTP状态文本(如"OK"、"Not Found")
  • 请求未完成时值为空字符串

(三)状态文本分类详解

1xx 信息类

状态码典型statusText含义
100"Continue"继续发送请求体
101"Switching Protocols"协议切换中

2xx 成功类

状态码典型statusText含义
200"OK"标准成功响应
201"Created"资源已创建
204"No Content"无返回内容

3xx 重定向类

状态码典型statusText含义
301"Moved Permanently"永久重定向
302"Found"临时重定向
304"Not Modified"使用缓存

4xx 客户端错误

状态码典型statusText含义
400"Bad Request"请求语法错误
401"Unauthorized"需要认证
403"Forbidden"禁止访问
404"Not Found"资源不存在

5xx 服务端错误

状态码典型statusText含义
500"Internal Server Error"服务器内部错误
503"Service Unavailable"服务不可用

(四)属性示例与输出

基础检测示例

const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/data', true);
xhr.onload = function() {console.log(`状态码: ${xhr.status}`);console.log(`状态描述: ${xhr.statusText}`);if(xhr.status === 200) {console.log('响应数据:', xhr.responseText);}
};
xhr.send();

典型输出‌:

状态码: 200
状态描述: OK
响应数据: {...}

(五)应用场景分析

1. 增强错误提示

xhr.onreadystatechange = function() {if(xhr.readyState === 4) {if(xhr.status >= 400) {showError(`${xhr.status}: ${xhr.statusText}`);}}
};

2. 多语言适配

const statusMessages = {'OK': '请求成功','Not Found': '资源未找到',// 其他翻译...
};xhr.onload = function() {const message = statusMessages[xhr.statusText] || xhr.statusText;showMessage(message);
};

3. 调试日志记录

console.log(`请求完成: ${xhr.status} ${xhr.statusText}`);
console.log(`响应头: ${xhr.getAllResponseHeaders()}`);

(六)注意事项

跨域限制‌:

  • 跨域请求仅能获取基本状态文本(如"OK"、"Not Found")
  • 详细描述可能被浏览器标准化处理

浏览器差异‌:

graph TDA[标准响应] --> B[Firefox:完整原文]A --> C[Chrome:标准化文本]A --> D[IE:可能为空]

时序要求‌:

  • 必须在readyState≥2时访问
  • 早期状态访问会得到空字符串

(七)综合比较表

特性statusTextstatusresponseText
数据类型字符串数值字符串
主要用途状态描述结果判断响应内容
跨域可见性部分受限部分受限完全受限
浏览器差异显著微小微小
现代替代方案Fetch的Response.statusTextResponse.statusResponse.text()

(八)现代替代方案

Fetch API状态处理

fetch('/api').then(res => {console.log(res.statusText);  // 等效statusTextif(!res.ok) throw new Error(res.statusText);return res.json();});

(九)最佳实践建议

防御性编程‌:

const statusText = xhr.statusText || 'Unknown Status';

结合状态码使用‌:

if(xhr.status === 404 && xhr.statusText === 'Not Found') {handleMissingResource();
}

日志优化‌:

function formatXhrLog(xhr) {return `${xhr.status} ${xhr.statusText} - ${xhr.responseURL}`;
}

通过合理运用statusText属性,开发者可以构建更人性化的错误处理系统和用户反馈机制,显著提升Web应用的用户体验。

十九、responseText 属性全面解析

(一)词源分解与功能定位

responseText 由两部分构成:

  • response‌(响应):表示服务器返回的内容
  • Text‌(文本):以字符串形式呈现

该属性是XHR对象的核心数据载体,用于获取服务器返回的‌文本形式‌的响应内容。

(二)语法结构

基础访问方式:

const responseData = xhr.responseText;

属性特征:

  • 只读属性(DOMString类型)
  • 包含服务器返回的原始文本
  • 请求未完成时值为空字符串

(三)数据类型与编码

1. 文本类型支持

内容类型处理方式示例
HTML原始字符串<div>content</div>
JSON需手动解析{"name":"value"}
XML可直接使用<note><body>text</body></note>
纯文本直接读取"Hello World"

2. 编码处理

  • 自动遵循响应头的Content-Type字符集声明
  • 默认UTF-8解码
  • 二进制数据会解码为乱码(应使用response属性)

(四)属性示例与输出

基础示例

const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/data', true);
xhr.onload = function() {if(xhr.status === 200) {console.log('响应文本:', xhr.responseText);console.log('长度:', xhr.responseText.length);}
};
xhr.send();

典型输出‌:

响应文本: {"status":"success","data":[1,2,3]}
长度: 32

(五)应用场景分析

1. JSON数据处理

const xhr2 = new XMLHttpRequest();
xhr2.open('GET', '/api/user/123', true);
xhr2.onload = function() {console.log('\n示例2 - JSON原始数据:');console.log(xhr2.responseText);const user = JSON.parse(xhr2.responseText);console.log('解析后对象:', user);
};
xhr2.send();// 输出可能:
// {"id":123,"name":"张三","age":28}
// 解析后对象: {id: 123, name: "张三", age: 28}

2. HTML片段插入

const xhr3 = new XMLHttpRequest();
xhr3.open('GET', '/widget/news', true);
xhr3.onload = function() {console.log('\n示例3 - HTML片段:');console.log(xhr3.responseText);document.getElementById('news-box').innerHTML = xhr3.responseText;
};
xhr3.send();// 输出可能:
// <div class="news-item"><h3>今日要闻</h3><p>经济持续向好...</p></div>

3. 大文本数据示例

const xhr4 = new XMLHttpRequest();
xhr4.open('GET', '/large-text', true);
xhr4.onprogress = function(e) {console.log(`已接收: ${e.loaded}字节`);
};
xhr4.onload = function() {console.log('\n示例4 - 大文本统计:');console.log(`总长度: ${xhr4.responseText.length}字符`);console.log(`前100字符: ${xhr4.responseText.substring(0,100)}...`);
};
xhr4.send();// 输出可能:
// 已接收: 102400字节
// 已接收: 204800字节
// 总长度: 356812字符
// 前100字符: 第一章 总则 第一条 为了规范...

4、错误处理示例

const xhr5 = new XMLHttpRequest();
xhr5.open('GET', '/api/non-existent', true);
xhr5.onload = function() {if(xhr5.status === 404) {console.log('\n示例5 - 错误响应:');console.log('错误内容:', xhr5.responseText);}
};
xhr5.send();// 输出可能:
// 错误内容: {"error":"Not Found","message":"请求资源不存在"}

5、实时数据流示例

const xhr6 = new XMLHttpRequest();
xhr6.open('GET', '/stream', true);
xhr6.onreadystatechange = function() {if(xhr6.readyState === 3) {console.log('\n示例6 - 实时数据:');console.log('部分数据:', xhr6.responseText);}
};
xhr6.send();// 输出可能(多次):
// 部分数据: 当前时间:2025-08-31 19:45:00
// 部分数据: 当前时间:2025-08-31 19:45:00\nCPU使用率:32%

(六)注意事项

性能考量‌:

  • 大文本(>1MB)可能造成内存压力
  • 二进制数据(如图片)不应使用此属性

安全风险‌:

graph LRA[responseText] --> B[直接innerHTML]B --> C[XSS攻击]style C fill:#f99,stroke:#900

时序要求‌:

  • 必须在readyState≥3时访问
  • readyState=3时获取的是已接收的部分数据

(七)综合比较表

特性responseTextresponseresponseXML
数据类型字符串多种类型Document对象
内存占用较高可控较高
适用场景文本内容二进制/文本XML文档
处理复杂度简单中等复杂
现代替代方案Fetch的Response.text()Response.blob()等已淘汰

(八)现代替代方案

Fetch API处理

fetch('/api').then(res => res.text())  // 替代responseText.then(text => {console.log('响应文本:', text);});

(九)最佳实践建议

防御性解析‌:

function safeParse(text) {try {return text ? JSON.parse(text) : null;} catch(e) {console.warn('解析失败:', e);return null;}
}

性能优化‌:

// 大文件建议使用responseType='arraybuffer'
if(estimatedSize > 1_000_000) {xhr.responseType = 'arraybuffer';
}

安全处理‌:

function sanitizeHTML(text) {const div = document.createElement('div');div.textContent = text;return div.innerHTML;
}

通过合理运用responseText属性,开发者可以高效处理各种文本格式的服务器响应,但需特别注意安全性和性能优化问题。在现代开发中,建议优先考虑使用Fetch API等更先进的替代方案。

二十、responseXML 属性深度解析

(一)词源分解与功能定位

responseXML 由两部分构成:

  • response‌(响应):表示服务器返回的内容
  • XML‌:可扩展标记语言格式

该属性是XHR对象的核心数据载体,用于获取服务器返回的‌XML格式‌的响应内容,并自动解析为DOM文档对象。

(二)语法结构

基础访问方式:

const xmlDoc = xhr.responseXML;

属性特征:

  • 只读属性(Document类型)
  • 包含解析后的XML文档对象
  • 请求未完成或解析失败时值为null

(三)数据类型与解析规则

1. 支持的内容类型

内容类型处理结果示例响应头
text/xml成功解析Content-Type: text/xml
application/xml成功解析Content-Type: application/xml
其他类型返回nullContent-Type: text/html

2. 解析过程

  1. 服务器返回XML格式数据
  2. 浏览器自动解析为DOM文档
  3. 可通过DOM API操作节点

(四)属性示例与输出

基础示例

const xhr = new XMLHttpRequest();
xhr.open('GET', '/data.xml', true);
xhr.onload = function() {if(xhr.status === 200) {const xmlDoc = xhr.responseXML;const titles = xmlDoc.getElementsByTagName('title');console.log('首个标题:', titles[0].textContent);}
};
xhr.send();

典型输出‌:

首个标题: XML数据示例

(五)应用场景分析

1. XML数据解析

const items = xhr.responseXML.getElementsByTagName('item');
Array.from(items).forEach(item => {console.log(item.getAttribute('id'));
});

2. RSS订阅处理

const xhr2 = new XMLHttpRequest();
xhr2.open('GET', '/rss/news', true);
xhr2.onload = function() {const xmlDoc = xhr2.responseXML;console.log('\n示例2 - RSS订阅解析:');console.log('频道标题:', xmlDoc.querySelector('channel title').textContent);const items = xmlDoc.querySelectorAll('item');items.forEach(item => {console.log('-', item.querySelector('title').textContent);});
};
xhr2.send();// 输出可能:
// 频道标题: 每日新闻
// - 经济持续增长
// - 科技新突破

3. SOAP接口调用

const xhr3 = new XMLHttpRequest();
xhr3.open('POST', '/soap-api', true);
xhr3.setRequestHeader('Content-Type', 'text/xml');
xhr3.onload = function() {const xmlDoc = xhr3.responseXML;console.log('\n示例3 - SOAP响应:');const result = xmlDoc.getElementsByTagName('soap:Body')[0].firstElementChild.getAttribute('status');console.log('操作状态:', result);
};
xhr3.send('<soap:Envelope>...</soap:Envelope>');// 输出可能:
// 操作状态: success

4、SVG图形处理示例

const xhr4 = new XMLHttpRequest();
xhr4.open('GET', '/images/chart.svg', true);
xhr4.onload = function() {const svgDoc = xhr4.responseXML;console.log('\n示例4 - SVG解析:');const paths = svgDoc.getElementsByTagName('path');console.log('路径数量:', paths.length);document.getElementById('svg-container').appendChild(svgDoc.documentElement);
};
xhr4.send();// 输出可能:
// 路径数量: 5

5、动态更新示例

const xhr6 = new XMLHttpRequest();
xhr6.open('GET', '/live-data', true);
xhr6.onreadystatechange = function() {if(xhr6.readyState === 3 && xhr6.responseXML) {const updates = xhr6.responseXML.getElementsByTagName('update');console.log('\n示例6 - 实时更新:');console.log('最新消息:', updates[updates.length-1].textContent);}
};
xhr6.send();// 输出可能(多次):
// 最新消息: 用户登录: admin
// 最新消息: 订单创建: #1001

(六)注意事项

MIME类型要求‌:

  • 必须设置正确的XML内容类型头
  • 可通过overrideMimeType()强制解析

浏览器差异‌:

graph TDA[XML解析] --> B[Chrome:严格模式]A --> C[Firefox:宽松模式]A --> D[IE:需ActiveX支持]

性能考量‌:

  • 大XML文档(>1MB)可能造成内存压力
  • 复杂XPath查询可能较慢

(七)综合比较表

特性responseXMLresponseTextresponse
数据类型Document对象字符串多种类型
内存占用较高较高可控
适用场景XML文档文本内容二进制/文本
处理复杂度复杂(DOM API)简单中等
现代替代方案Fetch+DOMParserResponse.text()Response.blob()等

(八)现代替代方案

Fetch API处理

fetch('/data.xml').then(res => res.text()).then(str => new DOMParser().parseFromString(str, 'text/xml')).then(xmlDoc => {console.log(xmlDoc.documentElement.nodeName);});

(九)最佳实践建议

错误处理‌:

if(!xhr.responseXML || xhr.responseXML.getElementsByTagName('parsererror').length > 0) {console.error('XML解析失败');
}

性能优化‌:

// 大文件建议使用SAX解析器替代
if(estimatedSize > 1_000_000) {useSAXParserInstead();
}

安全处理‌:

function sanitizeXML(xmlDoc) {// 移除脚本节点等危险内容const scripts = xmlDoc.getElementsByTagName('script');Array.from(scripts).forEach(script => script.remove());return xmlDoc;
}

通过合理运用responseXML属性,开发者可以高效处理各种XML格式的服务器响应,但需特别注意浏览器兼容性和性能优化问题。

二十一、response 属性深度解析

(一)词源分解与功能定位

response 由两部分构成:

  • re-‌(前缀):表示"返回"或"响应"
  • sponse‌(源自拉丁语spondere):意为"承诺"或"应答"

该属性是XHR对象的核心数据载体,用于获取服务器返回的响应内容,其数据类型取决于responseType的设置。

(二)语法结构

基础访问方式:

const data = xhr.response;

属性特征:

  • 只读属性
  • 返回类型由responseType决定
  • 请求未完成时值为null

(三)数据类型与响应类型对应关系

1. responseType 可选值

对应response数据类型说明
"" 或 "text"DOMString默认值,返回文本字符串
"arraybuffer"ArrayBuffer二进制数据缓冲区
"blob"Blob二进制大对象
"document"DocumentXML/HTML文档对象
"json"Object自动解析的JSON对象

2. 解析过程

  1. 服务器返回原始数据
  2. 根据responseType自动转换
  3. 可通过对应API操作数据

(四)属性示例与输出

基础文本示例

const xhr1 = new XMLHttpRequest();
xhr1.open('GET', '/api/text', true);
xhr1.onload = function() {console.log('文本响应:', xhr1.response);
};
xhr1.send();// 输出可能:
// "这是普通文本响应"

JSON数据处理

const xhr2 = new XMLHttpRequest();
xhr2.open('GET', '/api/data', true);
xhr2.responseType = 'json';
xhr2.onload = function() {console.log('JSON数据:', xhr2.response);console.log('用户名:', xhr2.response.username);
};
xhr2.send();// 输出可能:
// {username: "张三", age: 28}
// 用户名: 张三

二进制数据处理

const xhr3 = new XMLHttpRequest();
xhr3.open('GET', '/image.png', true);
xhr3.responseType = 'arraybuffer';
xhr3.onload = function() {const buffer = xhr3.response;console.log('接收字节数:', buffer.byteLength);
};
xhr3.send();// 输出可能:
// 接收字节数: 24576

(五)应用场景分析

1. 动态内容加载

xhr.responseType = 'document';
xhr.onload = function() {document.getElementById('content').appendChild(xhr.response.body);
};

2. 文件下载处理

xhr.responseType = 'blob';
xhr.onload = function() {const url = URL.createObjectURL(xhr.response);const a = document.createElement('a');a.href = url;a.download = 'file.pdf';a.click();
};

3. 实时数据可视化

xhr.responseType = 'json';
xhr.onload = function() {const ctx = document.getElementById('chart').getContext('2d');new Chart(ctx, {type: 'line',data: xhr.response});
};

(六)注意事项

兼容性问题‌:

  • IE10+才完全支持response属性
  • 旧版浏览器需使用responseText/responseXML

MIME类型处理‌:

  • 服务器应返回正确的Content-Type
  • 可使用overrideMimeType()强制解析

性能考量‌:

  • 大文件建议使用流式处理
  • 二进制数据比文本占用更多内存

(七)综合比较表

特性responseresponseTextresponseXML
返回类型多类型字符串Document对象
数据量支持大(二进制友好)中等较小
内存效率高(类型化)最低
处理复杂度中等简单复杂
现代替代方案Fetch APIFetch+text()Fetch+DOMParser

(八)现代替代方案示例

Fetch API处理JSON

fetch('/api/data').then(res => res.json()).then(data => console.log(data));

Fetch处理二进制数据

fetch('/image.png').then(res => res.arrayBuffer()).then(buffer => {// 处理ArrayBuffer});

(九)最佳实践建议

类型安全检测‌:

if(xhr.response instanceof ArrayBuffer) {// 安全处理二进制数据
}

错误处理‌:

xhr.onerror = function() {console.error('请求失败:', xhr.status);
};

性能监控‌:

xhr.onprogress = function(e) {console.log(`已接收: ${e.loaded}/${e.total}字节`);
};

通过合理运用response属性,开发者可以高效处理各种格式的服务器响应,但需特别注意浏览器兼容性和内存管理问题。

二十二、responseType 属性全面解析

(一)词源分解与功能定位

responseType 由两部分构成:

  • response‌(响应):表示服务器返回的内容
  • Type‌(类型):指定数据的格式类型

该属性用于控制XHR请求的响应数据类型,使开发者能够直接获取特定格式的响应内容,而无需手动转换。

(二)语法结构

基础设置方式:

xhr.responseType = 'json'; // 设置响应类型
const type = xhr.responseType; // 获取当前类型

属性特征:

  • 可读写属性
  • 必须在open()之后、send()之前设置
  • 同步请求设置会抛出InvalidAccessError异常

(三)参数值与数据类型对应

支持的参数值

对应数据类型说明
"" 或 "text"DOMString默认值,返回文本字符串
"arraybuffer"ArrayBuffer二进制数据缓冲区,用于处理音频、图片等
"blob"Blob二进制大对象,适合文件下载
"document"DocumentXML/HTML文档对象,自动解析
"json"Object自动解析的JavaScript对象
"ms-stream"流数据仅IE支持,用于流式传输

(四)属性示例与输出

文本数据处理

const xhr1 = new XMLHttpRequest();
xhr1.open('GET', '/api/text', true);
xhr1.responseType = 'text';
xhr1.onload = function() {console.log('文本响应:', xhr1.response);
};
xhr1.send();// 输出示例:
// "这是普通文本响应"

JSON数据处理

const xhr2 = new XMLHttpRequest();
xhr2.open('GET', '/api/data', true);
xhr2.responseType = 'json';
xhr2.onload = function() {console.log('用户数据:', xhr2.response.username);
};
xhr2.send();// 输出示例:
// "张三"

二进制图像处理

const xhr3 = new XMLHttpRequest();
xhr3.open('GET', '/image.png', true);
xhr3.responseType = 'arraybuffer';
xhr3.onload = function() {const buffer = xhr3.response;const blob = new Blob([buffer], {type: 'image/png'});const url = URL.createObjectURL(blob);document.getElementById('img').src = url;
};
xhr3.send();

(五)应用场景分析

1. 动态内容加载

xhr.responseType = 'document';
xhr.onload = function() {document.getElementById('content').appendChild(xhr.response.body);
};

2. 文件下载处理

xhr.responseType = 'blob';
xhr.onload = function() {const url = URL.createObjectURL(xhr.response);const a = document.createElement('a');a.href = url;a.download = 'report.pdf';a.click();
};

3. 实时数据可视化

xhr.responseType = 'json';
xhr.onload = function() {const ctx = document.getElementById('chart').getContext('2d');new Chart(ctx, {type: 'line',data: xhr.response});
};

(六)注意事项

兼容性问题‌:

  • IE10+才完全支持所有类型
  • "ms-stream"仅IE支持
  • 同步请求不支持设置responseType

MIME类型处理‌:

  • 服务器应返回正确的Content-Type
  • 类型不兼容时response返回null
  • 可使用overrideMimeType()强制解析

性能考量‌:

  • 大文件建议使用流式处理
  • 二进制数据比文本占用更多内存

(七)综合比较表

特性textarraybufferblobdocumentjson
返回类型字符串ArrayBufferBlobDocumentObject
数据量支持中等较小中等
内存效率最低中等
处理复杂度简单中等中等复杂简单
适用场景普通文本二进制数据文件下载XML/HTMLAPI响应

(八)最佳实践建议

类型安全检测‌:

if(xhr.response instanceof ArrayBuffer) {// 安全处理二进制数据
}

错误处理‌:

xhr.onerror = function() {if(xhr.response === null) {console.error('类型不匹配或解析失败');}
};

性能监控‌:

xhr.onprogress = function(e) {console.log(`已接收: ${e.loaded}/${e.total}字节`);
};

通过合理设置responseType,开发者可以高效处理各种格式的服务器响应,但需特别注意浏览器兼容性和类型匹配问题。对于现代开发,建议优先考虑Fetch API配合相应处理方法。

二十三、timeout 属性深度解析

(一)词源分解与功能定位

timeout 由两部分构成:

  • time‌(时间):表示时间相关的概念
  • out‌(超出):表示超过某个界限

该属性用于设置XHR请求的超时时间,当请求持续时间超过设定值时自动终止请求并触发相应事件。

(二)语法结构

基础设置方式:

xhr.timeout = 3000; // 设置超时为3秒

属性特征:

  • 数值类型,单位为毫秒
  • 默认值为0,表示无超时限制
  • 必须在open()之后、send()之前设置

(三)参数值与事件机制

1. 参数值说明

含义说明
0无超时默认值,请求将无限期等待
>0超时毫秒数从请求开始(onloadstart)到完成(onloadend)的总时间限制

2. 相关事件

  • ontimeout‌:超时触发的事件处理程序
  • onabort‌:请求被终止时触发
  • onerror‌:请求出错时触发

(四)属性示例与输出

基础超时设置

const xhr1 = new XMLHttpRequest();
xhr1.open('GET', '/api/data', true);
xhr1.timeout = 2000; // 2秒超时
xhr1.ontimeout = function() {console.error('请求超时');
};
xhr1.send();// 输出可能:
// 请求超时 (当2秒内未收到响应时)

超时与正常响应处理

const xhr2 = new XMLHttpRequest();
xhr2.open('POST', '/submit', true);
xhr2.timeout = 5000;
xhr2.onload = function() {console.log('响应数据:', xhr2.response);
};
xhr2.ontimeout = function() {console.warn('操作超时,请重试');
};
xhr2.send(JSON.stringify({data: 'test'}));// 可能输出1:
// 响应数据: {status: "success"}// 可能输出2:
// 操作超时,请重试 (5秒内未收到响应时)

(五)应用场景分析

1. 关键操作超时控制

// 支付请求设置严格超时
xhr.timeout = 10000; // 10秒
xhr.ontimeout = () => {showAlert('支付网关响应超时');revertTransaction();
};

2. 大文件上传监控

// 大文件上传设置较长超时
xhr.timeout = 300000; // 5分钟
xhr.upload.onprogress = updateProgressBar;
xhr.ontimeout = () => {alert('上传时间过长,请检查网络');
};

3. 实时数据轮询

// 实时数据请求设置短超时
function pollData() {xhr.timeout = 3000;xhr.ontimeout = pollData; // 超时后立即重试xhr.onload = processData;xhr.send();
}

(六)注意事项

执行顺序问题‌:

  • ontimeout处理程序执行完后才会自动取消请求
  • 同步请求不支持设置timeout

浏览器兼容性‌:

  • IE8+支持timeout属性
  • 部分移动浏览器可能有不同实现

性能影响‌:

  • 过短的超时可能导致频繁重试
  • 应考虑网络状况设置合理值

与abort()的区别‌:

  • timeout是自动取消
  • abort()是手动取消

(七)综合比较表

特性timeout机制手动abort()无超时设置
触发方式自动手动调用
控制精度毫秒级即时无限制
相关事件ontimeoutonabort
内存释放自动自动依赖浏览器
适用场景常规请求用户主动取消后台长任务

(八)最佳实践建议

分层超时设置‌:

// 根据操作重要性设置不同超时
const timeouts = {critical: 5000,normal: 15000,background: 60000
};

错误恢复机制‌:

let retries = 0;
xhr.ontimeout = function() {if(retries++ < 3) {this.send(); // 有限次重试}
};

用户体验优化‌:

xhr.ontimeout = function() {showLoading(false);showRetryButton();
};

通过合理设置timeout属性,可以有效提升应用的健壮性和用户体验,但需注意与服务器端超时的协调以及移动网络环境下的特殊处理。

二十四、withCredentials 属性全面解析

(一)词源分解与功能定位

withCredentials 由两部分构成:

  • with‌(携带):表示伴随或包含
  • Credentials‌(凭证):指认证信息如cookies、HTTP认证等

该属性控制跨域请求时是否携带用户凭证信息,解决跨域请求的安全性问题。

(二)语法结构

基础设置方式:

xhr.withCredentials = true; // 允许携带凭证
const creds = xhr.withCredentials; // 获取当前设置

属性特征:

  • 布尔类型,默认为false
  • 必须在open()之后、send()之前设置
  • 同步请求设置会抛出InvalidStateError异常

(三)参数值与功能说明

    参数值类型

含义服务器要求
true携带跨域凭证需设置Access-Control-Allow-Credentials: true
false不携带凭证(默认)无特殊要求

(四)属性示例与输出

基础跨域请求示例

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true);
xhr.withCredentials = true; // 关键设置
xhr.onload = function() {console.log('响应数据:', xhr.response);
};
xhr.send();// 成功输出示例:
// {user: "admin", token: "xyz123"}

凭证验证失败案例

xhr.withCredentials = true;
xhr.open('GET', 'https://api.other.com/auth', true);
xhr.onerror = function() {console.error('请求失败:', xhr.status);
};
xhr.send();// 可能输出(服务器未配置CORS):
// 请求失败: 0

(五)应用场景分析

1. 跨域单点登录(SSO)

// 主站向认证服务发起请求
xhr.withCredentials = true;
xhr.open('GET', 'https://auth.service.com/session', true);
xhr.onload = updateUserStatus;

2. 第三方API授权

// 携带OAuth令牌访问API
xhr.withCredentials = true;
xhr.setRequestHeader('Authorization', 'Bearer token123');
xhr.open('POST', 'https://api.provider.com/data', true);

3. 跨域文件上传

// 上传到不同域的文件存储服务
const formData = new FormData();
formData.append('file', fileInput.files[0]);
xhr.withCredentials = true;
xhr.open('POST', 'https://storage.example.com/upload', true);

(六)注意事项

服务器配置要求‌:

  • 必须返回Access-Control-Allow-Credentials: true
  • Access-Control-Allow-Origin不能为通配符*
  • 需明确指定允许的源(如https://yourdomain.com)

安全限制‌:

  • 第三方cookie仍受同源策略保护
  • 无法通过JavaScript读取跨域cookie

浏览器兼容性‌:

  • IE10+完全支持
  • 移动端浏览器可能有特殊限制

预检请求影响‌:

  • 复杂请求会先发送OPTIONS预检
  • 服务器需正确处理OPTIONS请求

(七)综合比较表

特性withCredentials=truewithCredentials=false
跨域凭证携带
服务器要求严格CORS配置基础CORS配置
适用场景需要认证的跨域请求公开API访问
安全性较高(受同源策略限制)最高
性能影响可能增加预检请求无额外影响

(八)最佳实践建议

动态源配置‌:

// 根据当前域自动设置
xhr.withCredentials = !isSameOrigin(requestUrl);

错误恢复机制‌:

xhr.onerror = function() {if(xhr.status === 0) {fallbackToJSONP(); // CORS失败备选方案}
};

安全检测‌:

if(needCredentials && !('withCredentials' in xhr)) {alert('浏览器不支持安全凭证传输');
}

通过合理使用withCredentials属性,可以实现安全的跨域认证交互,但必须严格遵循CORS规范并做好兼容性处理。

二十五、upload 属性全面解析

(一)词源分解与功能定位

upload 由两部分构成:

  • up‌(向上):表示数据流向
  • load‌(加载):表示数据传输过程

该属性返回一个XMLHttpRequestUpload对象,专门用于监控上传进度和状态,是XHR Level 2规范新增的重要特性。

(二)语法结构

基础访问方式:

const uploadObj = xhr.upload;

属性特征:

  • 只读属性,返回XMLHttpRequestUpload实例
  • 必须在open()之后访问才有意义
  • 与XHR共享相同的事件接口

(三)事件类型与参数

    支持的事件类型

事件触发时机事件对象属性
loadstart上传开始时触发loaded, total
progress数据传输过程中周期性触发loaded, total, lengthComputable
abort上传被中止时触发-
error上传失败时触发-
load上传成功完成时触发loaded, total
timeout上传超时时触发-
loadend上传结束时触发(无论成功与否)loaded, total

其中progress事件的event对象包含:

  • loaded:已传输字节数
  • total:总字节数(如果可计算)
  • lengthComputable:布尔值,表示总大小是否可知

(四)属性示例与输出

基础文件上传监控

const xhr = new XMLHttpRequest();
xhr.open('POST', '/upload', true);xhr.upload.onprogress = function(e) {if(e.lengthComputable) {const percent = Math.round((e.loaded / e.total) * 100);console.log(`上传进度: ${percent}%`);}
};xhr.upload.onload = function() {console.log('上传完成');
};const fileInput = document.getElementById('fileInput');
xhr.send(fileInput.files[0]);// 输出示例:
// 上传进度: 25%
// 上传进度: 68%
// 上传完成

多事件综合处理

xhr.upload.onloadstart = () => console.log('开始上传');
xhr.upload.onerror = () => console.error('上传失败');
xhr.upload.onabort = () => console.warn('上传已取消');
xhr.upload.ontimeout = () => console.error('上传超时');

(五)应用场景分析

1. 大文件上传进度显示

// 创建进度条UI
const progressBar = document.getElementById('progress');xhr.upload.onprogress = function(e) {if(e.lengthComputable) {progressBar.value = (e.loaded / e.total) * 100;}
};

2. 断点续传实现

// 记录已上传字节数
let uploadedBytes = 0;xhr.upload.onprogress = function(e) {uploadedBytes = e.loaded;
};xhr.upload.onerror = function() {// 失败时保存已上传量localStorage.setItem('resumePoint', uploadedBytes);
};

3. 多文件并行上传控制

// 限制并发上传数
const MAX_UPLOADS = 3;
let activeUploads = 0;function startUpload(file) {if(activeUploads >= MAX_UPLOADS) return false;const xhr = new XMLHttpRequest();xhr.open('POST', '/upload', true);activeUploads++;xhr.upload.onloadend = function() {activeUploads--;checkQueue();};xhr.send(file);return true;
}

(六)注意事项

浏览器兼容性‌:

  • IE10+支持完整功能
  • 移动端浏览器可能有事件触发频率限制

性能考量‌:

  • 高频progress事件可能影响性能
  • 大文件建议适当降低事件处理频率

安全限制‌:

  • 跨域上传需服务器配置CORS
  • 某些浏览器限制上传文件类型

与download区别‌:

  • upload只监控上行数据
  • download监控通过xhr自身事件

(七)综合比较表

特性upload事件常规XHR事件Fetch API
进度监控精细到字节级仅整体状态通过ReadableStream
适用阶段仅上传阶段整个请求周期整个请求周期
事件类型专有上传事件集通用HTTP事件更现代化的事件模型
浏览器支持IE10+所有支持XHR的浏览器现代浏览器
内存效率中等中等较高

(八)最佳实践建议

节流优化‌:

let lastUpdate = 0;
xhr.upload.onprogress = function(e) {const now = Date.now();if(now - lastUpdate > 200) { // 200ms节流updateProgress(e);lastUpdate = now;}
};

错误恢复‌:

xhr.upload.onerror = function() {if(retryCount++ < 3) {setTimeout(retryUpload, 1000);}
};

用户体验优化‌:

xhr.upload.onloadstart = showSpinner;
xhr.upload.onloadend = hideSpinner;
xhr.upload.onprogress = updateProgressBar;

        通过合理利用upload属性,开发者可以实现精细化的上传控制,特别适合大文件传输、实时进度反馈等场景,但需注意浏览器兼容性和性能优化。

http://www.xdnf.cn/news/19561.html

相关文章:

  • 基于单片机智能保温杯/智能水杯
  • Java基础第7天总结(代码块、内部类、函数式编程)
  • 【多模态】使用LLM生成html图表
  • 打开多个Excel文件后快速关闭所有的文档,并且退出Excel应用
  • s[:] = reversed(s) 和 s = reversed(s)的区别
  • 【Proteus仿真】点亮小灯系列仿真——小灯闪烁/流水灯/交通灯
  • R3:适用于 .NET 的新一代响应式扩展库,事件订阅流
  • TFS-2002《Fuzzy Clustering With Viewpoints》
  • 嵌入式ARM程序高级调试技能:19.qumu arm elf无法生成coredump
  • 接口测试:如何定位BUG的产生原因
  • nginx-增加VTS模块
  • 数据结构八股
  • 数据结构(C语言篇):(八)栈
  • vscode+EIDE+Clangd环境导入keil C51以及MDK工程
  • shell脚本第六阶段---三剑客之sed
  • C++日志系统:高效异步日志实现解析
  • LeetCode 36. 有效的数独 - 解题思路与实现详解
  • ans.1中的对象标识符OBJECT_IDENTIFIER----OID
  • 【机器学习基础】决策树算法原理及其在无人驾驶技术中的应用
  • Matplotlib:让数据在Python中跳舞的魔法画笔![特殊字符]
  • 基于FPGA的正弦波和及滤波(已通过仿真和上板)
  • 如何确定虚拟机的IP
  • DVWA靶场通关笔记-SQL Injection (Impossible级别)
  • [ Android Audio 篇 ] 高通平台 Android AudioRecord 多通道录音
  • LangChain中Prompt处理机制的技术架构与核心思想分析
  • STL库——stack/queue(类函数学习)
  • 切片语法[::-1]及其可用的类型
  • 基于STM32设计的智能家居控制系统(华为云IOT)_275
  • 2023年IEEE IOTJ SCI1区TOP,动态环境下无人机目标覆盖任务路径规划,深度解析+性能实测
  • KingbaseES JDBC 驱动详解:连接、配置与最佳实践