AJAX 开发中的注意点

关键词:AJAX、异步请求、前端开发、跨域、错误处理、安全、性能优化


✅ 引言

在现代 Web 应用中,AJAX 是实现前后端数据交互的重要手段。然而,在实际开发过程中,如果不注意一些常见问题,可能会导致应用出现安全性漏洞、用户体验下降、甚至功能异常。

本文将围绕 AJAX 开发中的注意点 进行详细讲解,并为每个小节提供完整的示例代码,帮助你写出更稳定、安全、高效的 AJAX 请求。


📌 一、1. 错误处理:不要忽视失败的请求

❗ 问题说明:

很多开发者只关注成功返回的数据,而忽略了网络中断、服务器错误等情况,这会导致用户界面无法正确反馈或程序逻辑异常。

✅ 解决方案:

  • 使用 .catch() 捕获 Promise 错误
  • 添加超时机制
  • 提供友好的错误提示

示例代码:Fetch API 中的错误处理

async function fetchData() {try {const response = await fetch('https://jsonplaceholder.typicode.com/non-existent');if (!response.ok) {throw new Error(`HTTP error! Status: ${response.status}`);}const data = await response.json();console.log(data);} catch (error) {console.error('请求失败:', error.message);alert('加载数据失败,请检查网络连接或稍后再试!');}
}

📌 二、2. 跨域问题(CORS):避免“拒绝访问”陷阱

❗ 问题说明:

当你的前端应用尝试请求不同域名下的资源时,浏览器会出于安全考虑阻止该请求,除非后端明确允许。

✅ 解决方案:

  • 后端设置响应头 Access-Control-Allow-Origin
  • 使用代理服务器(如 Nginx 或 Node.js)
  • 避免使用 JSONP(已不推荐)

示例代码:Node.js Express 设置 CORS 头

const express = require('express');
const app = express();app.use((req, res, next) => {res.header("Access-Control-Allow-Origin", "*"); // 允许所有来源res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");next();
});app.get('/api/data', (req, res) => {res.json({ message: '跨域请求成功!' });
});

📌 前端调用:

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

📌 三、3. 安全性:防范 XSS 和 CSRF 攻击

❗ 问题说明:

AJAX 请求如果直接将用户输入作为参数传递给后端,可能会造成 XSS(跨站脚本攻击)CSRF(跨站请求伪造)

✅ 解决方案:

  • 对用户输入进行转义(如使用 textContent 替代 innerHTML
  • 使用 Token 认证机制(如 JWT)
  • 后端验证 Referer 和 Origin

示例代码:防止 XSS 注入

function displayUserInput(input) {const outputDiv = document.getElementById('output');// ❌ 不安全写法// outputDiv.innerHTML = input;// ✅ 安全写法outputDiv.textContent = input;
}// 假设用户输入了恶意脚本
displayUserInput("<script>alert('XSS')</script>");

📌 四、4. 加载状态提示:提升用户体验

❗ 问题说明:

AJAX 请求可能耗时较长,用户不知道是否正在加载,容易重复点击或失去耐心。

✅ 解决方案:

  • 在请求开始前显示“加载中…”
  • 请求结束后隐藏提示
  • 可以使用动画或遮罩层增强体验

示例代码:添加加载提示

<div id="loading" style="display:none;">正在加载数据...</div>
<button onclick="fetchData()">获取数据</button><script>
function fetchData() {const loading = document.getElementById('loading');loading.style.display = 'block';fetch('https://jsonplaceholder.typicode.com/posts/1').then(response => response.json()).then(data => {console.log(data);loading.style.display = 'none';}).catch(error => {console.error(error);loading.style.display = 'none';});
}
</script>

📌 五、5. 频率控制:避免频繁请求影响性能

❗ 问题说明:

比如在搜索框中每输入一个字符就发送一次请求,会导致服务器压力剧增。

✅ 解决方案:

  • 使用防抖(debounce)
  • 使用节流(throttle)

示例代码:使用防抖控制请求频率

function debounce(func, delay) {let timer;return function (...args) {clearTimeout(timer);timer = setTimeout(() => func.apply(this, args), delay);};
}document.getElementById('searchInput').addEventListener('input', debounce(fetchResults, 300));function fetchResults(e) {const query = e.target.value;console.log('发送搜索请求:', query);// 实际请求逻辑...
}

📌 六、6. 缓存策略:减少重复请求

❗ 问题说明:

对相同资源的重复请求不仅浪费带宽,也会影响页面性能。

✅ 解决方案:

  • 利用 HTTP 缓存(Cache-Control、ETag)
  • 前端本地缓存(localStorage、sessionStorage)

示例代码:使用 localStorage 缓存数据

async function getCachedData() {const cached = localStorage.getItem('cachedData');if (cached) {console.log('从缓存中读取数据');return JSON.parse(cached);}const response = await fetch('https://jsonplaceholder.typicode.com/posts/1');const data = await response.json();localStorage.setItem('cachedData', JSON.stringify(data));return data;
}

📌 七、7. 请求取消:避免无效操作

❗ 问题说明:

当用户快速切换页面或取消操作时,仍在执行的 AJAX 请求可能已经不再需要,继续执行会造成资源浪费。

✅ 解决方案:

  • 使用 AbortController 取消请求

示例代码:使用 AbortController 取消 Fetch 请求

let controller;function startRequest() {if (controller) controller.abort(); // 如果已有请求,先取消controller = new AbortController();const signal = controller.signal;fetch('https://jsonplaceholder.typicode.com/posts/1', { signal }).then(res => res.json()).then(data => console.log(data)).catch(err => {if (err.name === 'AbortError') {console.log('请求已被取消');} else {console.error('请求失败:', err);}});
}function cancelRequest() {if (controller) {controller.abort();}
}

📌 八、8. 数据格式统一:确保前后端协同

❗ 问题说明:

前后端如果没有约定好数据结构,可能导致解析失败或逻辑混乱。

✅ 解决方案:

  • 统一返回格式(如 { code: 200, message: '', data: {} }
  • 前端封装通用请求函数

示例代码:统一数据格式 + 封装请求函数

async function apiRequest(url, options) {try {const response = await fetch(url, options);const result = await response.json();if (result.code !== 200) {throw new Error(result.message || '请求失败');}return result.data;} catch (error) {console.error('API 请求异常:', error.message);throw error;}
}// 使用示例
apiRequest('https://jsonplaceholder.typicode.com/posts/1').then(data => console.log('请求成功:', data)).catch(err => console.error('请求出错:', err));

✅ 总结

注意点建议
错误处理使用 try/catch、catch 方法捕获异常
跨域问题后端配置 CORS、使用代理
安全性输入转义、Token 验证
加载提示显示“正在加载…”状态
请求频率使用防抖、节流控制
缓存策略利用 HTTP 缓存和 localStorage
请求取消使用 AbortController
数据格式统一前后端数据结构

📚 推荐阅读

  • MDN - Fetch API
  • W3Schools - AJAX 教程
  • 掘金 - AJAX 最佳实践

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

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

相关文章

类之间的纵向关系——继承

继承定义&#xff1a;被继承的类叫做基类&#xff08;父类&#xff09;&#xff0c;继承的类叫派生类&#xff08;子类&#xff09;&#xff0c;在派生类类名后面加&#xff1a; 继承方式 基类class CFather{}; class CSon:public CFather{};父类(基类)与子类(派生类)之间的关系…

bytetrack漏检补齐

bytetrack漏检补齐1.人流慢速运动&#xff0c;跟踪效果比较好&#xff0c;偶尔有漏检&#xff0c;跟踪可以自动补齐。2.快速运动&#xff0c;频繁遮挡&#xff0c;效果可能不好*如果漏检&#xff0c;倒着跟踪&#xff0c;把丢失的检测框拷贝出来&#xff0c;保留进行跟踪。有时…

安装Keycloak并启动服务(macOS)

前提&#xff1a;电脑已经安装Java 17 1、下载Keycloak 2、下载完后解压缩&#xff0c;使用文本编辑器修改配置文件&#xff08;keycloak/conf/keycloak.conf&#xff09; # Basic settings for running in production. Change accordingly before deploying the server. # …

汽车动力转向器落锤冲击试验台

落锤冲击试验台主要用于扣件减振量的测试&#xff0c;采用电动锚链提锤结构&#xff0c;控制精度高&#xff0c;定位准确。采用伺服电机减速机驱动&#xff0c;避免提锤加速和到位减速时的冲击&#xff0c;具有多重安全保护功能&#xff0c;防止二次冲击装置。主机框架采用上下…

Linux系统集群部署模块之Keepalived双机热备

目录 概述 一、keepalived安装 二、配置文件 三、 其他配置项说明 四、名词解释 五、高阶使用 1、介绍 2、keepalived主要作用 3、工作在三层、四层和七层原理 4、健康状态检测方式 4.1 HTTP服务状态检测 4.2 TCP端口状态检测&#xff08;使用TCP端口服务基本上都可…

TDengine 使用最佳实践(1)

目录 数据建模 单列模型 多列模型 分库分表 边界限制 资源规划 CPU 主频 CPU 核数 内存分类 内存计算 CPU 内存比例 磁盘 网络 下一篇 TDengine 使用最佳实践&#xff08;1&#xff09; 关于 TDengine TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台&am…

Java行为型模式---责任链模式

责任链模式基础概念责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;其核心思想是将请求的发送者和接收者解耦&#xff0c;使多个对象都有机会处理请求。这些对象连接成一条链&#xff0c;请求沿着链传递&#xff0c;直到有…

嵌入式学习笔记- 结构体名字被赋值时是整体内容赋值

结构体变量名被赋值时&#xff0c;‌不是赋值的地址&#xff0c;而是执行对整个结构体内容的复制&#xff08;值拷贝&#xff09;‌直接赋值是成员级复制‌ 当使用 s2 s1; 形式的赋值时&#xff08;其中 s1 和 s2 是同类型结构体变量&#xff09;&#xff0c;系统会‌逐成员复…

基于UDP/IP网络游戏加速高级拥塞控制算法(示意:一)

/* ███████╗ 基于UDP/IP网络游戏加速高级拥塞控制算法&#xff08;示意&#xff1a;一&#xff09; ███████╗ */#pragma once#include <iostream> #include <vector> #include <deque> #include <cmath> #include <algorithm> …

【YOLOv11-目标检测】06-模型部署(C++)

上一节课,我们学习了模型的预测。那么,如何用C++部署呢? 克隆项目 进入cmd,进入自己的项目文件夹,然后git clone项目: git clone https://github.com/Geekgineer/YOLOs-CPP 进入到YOLOs-CPP文件夹: 配置环境 ONNX Runtime 后续构建项目的时候,会自动下载,因此,我…

【第零章编辑器开发与拓展】

前言&#xff1a;对编辑器拓展与开发可以节省很多时间&#xff0c;提高开发效率&#xff0c;比如技能编辑器&#xff0c;关卡编辑器这种。当然这只是编辑器开发的一些典型应用&#xff0c;它能做不止这些。学习完这个之后&#xff0c;我们可以开发项目需要的工具。我本意在编辑…

使用 mongoimport 导入本地 JSON 文件到 MongoDB 及数据查看指南

在项目中&#xff0c;我们经常需要将本地 JSON 文件批量导入 MongoDB 数据库。本文以 Ubuntu 22.04 环境为例&#xff0c;详细记录了如何安装 mongoimport 工具、正确导入多个 JSON 文件&#xff0c;以及查看导入后的数据。一、环境介绍操作系统&#xff1a;Ubuntu 22.04.5 LTS…

新手向:Python数据处理Excel报表自动化生成与分析

Python实现Excel报表自动化系统全流程指南本文将详细介绍如何使用Python实现一个完整的Excel报表自动化系统&#xff0c;涵盖从数据清洗、分析到可视化报表生成的全流程。本教程面向Python初学者&#xff0c;通过实际案例讲解pandas和openpyxl库的核心用法。系统概述Excel报表自…

【第六节】docker可视化工具portainer安装

该文章参考了这篇文章https://zhuanlan.zhihu.com/p/27740131259portainer是一个基于网页的docker可视化管理工具&#xff0c;试想一下我们怎么登录路由器管理界面的&#xff0c;异曲同工。那么就需要在服务器的docker内安装portainer&#xff0c;然后在我们的开发机或者说工作…

使用 Certbot 申请和自动续签 Let’s Encrypt 的免费 SSL 证书

一. Let’s Encrypt 介绍 Let’s Encrypt 是当前最常用的免费 HTTPS 证书生成工具之一。该服务由非营利组织提供&#xff0c;致力于为全球范围内的网站提供便捷的自动化证书颁发服务。虽然 Let’s Encrypt 证书的有效期只有90天&#xff0c;但是可以自动续期&#xff0c;这使得…

【kubernetes】--controller(DaemonSet)

Kubernetes DaemonSet 控制器详解 它确保集群中所有(或部分)节点上都运行一个 Pod 的副本。当有新节点加入集群时&#xff0c;DaemonSet 会自动在新节点上创建 Pod&#xff1b;当节点从集群中移除时&#xff0c;这些 Pod 也会被垃圾回收。 DaemonSet 的核心特性 每个节点一个 P…

内测分发平台应用的异地容灾和负载均衡处理和实现思路

内测分发平台应用的异地容灾和负载均衡处理和实现思路如下&#xff1a;一、异地容灾1.风险评估和需求分析&#xff1a;对现有的IT基础设施进行全面的风险评估和需求分析&#xff0c;评估潜在风险和灾害的可能性&#xff0c;以及确定业务和数据的关键性。2.设计备份架构&#xf…

【Vue】浏览器缓存 sessionStorage、localStorage、Cookie

嘿&#xff0c;各位 Vue 开发者们&#xff01;今天咱们来好好聊聊浏览器里的三种缓存方式&#xff1a;sessionStorage、localStorage 和 Cookie。在实际开发中&#xff0c;合理运用这些缓存能让我们的应用性能大幅提升&#xff0c;同时避免一些不必要的问题。下面就跟着我的笔记…

c#如何将不同类型的数据存储到一起

在 C# 中&#xff0c;存储不同类型的数据有多种方式&#xff0c;具体选择取决于你的需求&#xff08;类型安全、性能、灵活性等&#xff09;。以下是常见的解决方案及其适用场景&#xff1a;1. 使用 object 类型&#xff08;装箱 / 拆箱&#xff09;将所有数据转换为基类 objec…

超唯美治愈风卡通插画PPT模版

海洋卡通风治愈系PPT模版&#xff0c;儿童可爱治愈可爱PPT模版&#xff0c;治愈风商务通用PPT模版&#xff0c;治愈系课件PPT模版&#xff0c;治愈风插画PPT模版&#xff0c;超唯美治愈风PPT模版&#xff0c;可爱插画治愈系女孩PPT模版 超唯美治愈风卡通插画PPT模版&#xff1a…