【AJAX详解】

AJAX详解

AJAX(Asynchronous JavaScript and XML)是一种创建交互式网页应用的网页开发技术。它允许在不重新加载整个页面的情况下,通过后台与服务器交换数据并更新部分网页内容。这提供了更流畅的用户体验,因为用户不需要等待整个页面刷新来获取新的信息。

AJAX的核心概念

  1. 异步通信:传统的网页请求是同步的,意味着当浏览器向服务器发送请求时,必须等待服务器响应完成才能继续处理其他任务。而AJAX实现了异步通信,浏览器可以发送请求后继续执行其他操作,当服务器返回结果时再处理这些数据。

  2. JavaScript:用于编写客户端脚本,控制和发起异步请求,并处理来自服务器的响应。

  3. XMLHttpRequest对象:这是实现AJAX功能的核心,是一个内置的浏览器对象,允许你从Web页面中向服务器发送请求并处理响应,而无需刷新页面。尽管名字中有XML,但它可以用来发送和接收各种格式的数据,如JSON、纯文本等。

  4. DOM(Document Object Model):DOM表示HTML或XML文档的对象模型,它是结构化的节点树。使用JavaScript可以通过DOM API修改页面的内容、结构和样式,以响应从服务器接收到的新数据。

  5. 服务器端:服务器端需要能够处理来自客户端的请求,并根据请求提供适当的数据响应。这通常涉及到数据库查询、业务逻辑处理等。

AJAX的工作流程

  • 客户端使用JavaScript创建一个XMLHttpRequest对象。
  • 通过该对象发送一个HTTP请求到服务器(GET或POST方法)。
  • 服务器处理请求,并将数据(通常是JSON、XML或其他格式)作为响应返回给客户端。
  • 客户端接收到响应后,使用JavaScript解析数据,并根据需要更新页面的一部分。

使用AJAX的优缺点

优点

  • 改善用户体验,页面不会因为数据更新而完全重载。
  • 减少网络流量,只传输必要的数据。
  • 提升性能,因为减少了不必要的页面刷新。

缺点

  • 可能影响SEO(搜索引擎优化),因为动态加载的内容可能不容易被搜索引擎索引。
  • 需要良好的错误处理机制,因为异步请求可能会失败。
  • 对于不支持JavaScript的浏览器或设备,AJAX功能将不可用。
  • 增加了前端代码的复杂性,需要更多的调试和维护。

现代替代方案

随着Web技术的发展,现在有许多更现代化的技术和库可以简化AJAX的使用,例如:

  • Fetch API:这是一个相对现代的接口,用于发起网络请求。它解决了XMLHttpRequest的一些设计问题,并且更容易使用Promise进行链式调用。
  • Axios:这是一个基于Promise的HTTP客户端,用于浏览器和Node.js。它提供了比原生fetch更丰富的API,并支持更多特性,如自动转换JSON数据、取消请求等。
  • jQuery:虽然jQuery的流行度有所下降,但它的.ajax()方法和其他相关函数仍然广泛用于简化AJAX请求。
  • 框架和库:像React、Vue.js和Angular这样的前端框架通常有自己的方式来处理数据获取和状态管理,它们可能会包含自己的工具或推荐特定的库来进行网络请求。

使用示例

HTML + JavaScript (使用XMLHttpRequest)

<!DOCTYPE html>
<html>
<head><title>AJAX 示例</title>
</head>
<body><!-- 1. 创建一个按钮,用户点击时触发AJAX请求 --><button id="loadBtn">加载数据</button><!-- 2. 创建一个用于展示AJAX返回数据的区域 --><div id="content"></div><script type="text/javascript">// 3. 获取DOM中的按钮元素var loadButton = document.getElementById('loadBtn');// 4. 为按钮添加点击事件监听器loadButton.addEventListener('click', function() {// 5. 创建一个新的XMLHttpRequest对象var xhr = new XMLHttpRequest();// 6. 定义当请求状态改变时要执行的函数xhr.onreadystatechange = function() {// 7. 检查请求是否完成且状态码表示成功if (xhr.readyState === 4 && xhr.status === 200) {// 8. 如果请求成功,则获取响应文本并更新页面内容document.getElementById('content').innerHTML = xhr.responseText;}};// 9. 打开与服务器的连接(指定请求类型、URL以及是否异步)xhr.open('GET', 'https://api.example.com/data', true);// 10. 发送请求到服务器xhr.send();});</script>
</body>
</html>

使用Fetch API

<!DOCTYPE html>
<html>
<head><title>Fetch API 示例</title>
</head>
<body><!-- 1. 创建一个按钮,用户点击时触发AJAX请求 --><button id="loadBtn">加载数据</button><!-- 2. 创建一个用于展示AJAX返回数据的区域 --><div id="content"></div><script type="text/javascript">// 3. 获取DOM中的按钮元素const loadButton = document.getElementById('loadBtn');// 4. 为按钮添加点击事件监听器loadButton.addEventListener('click', async function() {try {// 5. 使用fetch发起一个GET请求const response = await fetch('https://api.example.com/data');// 6. 检查HTTP响应的状态码是否表示成功if (!response.ok) {throw new Error('网络响应失败');}// 7. 将响应体解析为文本const data = await response.text();// 8. 更新页面上的内容document.getElementById('content').innerHTML = data;} catch (error) {// 9. 处理可能发生的错误console.error('数据加载出错:', error);document.getElementById('content').innerHTML = '无法加载数据';}});</script>
</body>
</html>

jQuery AJAX GET 请求

<!DOCTYPE html>
<html>
<head><title>jQuery AJAX 示例</title><!-- 1. 引入jQuery库 --><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body><!-- 2. 创建一个按钮,用户点击时触发AJAX请求 --><button id="loadBtn">加载数据</button><!-- 3. 创建一个用于展示AJAX返回数据的区域 --><div id="content"></div><script type="text/javascript">// 4. 文档准备就绪后执行代码$(document).ready(function() {// 5. 获取DOM中的按钮元素,并添加点击事件监听器$('#loadBtn').click(function() {// 6. 使用$.ajax()方法发起GET请求$.ajax({url: 'https://api.example.com/data', // 7. 指定请求的URLmethod: 'GET', // 8. 指定HTTP请求方法dataType: 'json', // 9. 指定预期服务器返回的数据类型success: function(data) { // 10. 成功回调函数,当请求成功时调用// 11. 更新页面上的内容$('#content').html(JSON.stringify(data)); // 将JSON对象转换为字符串并显示},error: function(jqXHR, textStatus, errorThrown) { // 12. 错误回调函数,当请求失败时调用// 13. 处理可能发生的错误console.error('数据加载出错:', textStatus, errorThrown);$('#content').html('无法加载数据');}});});});</script>
</body>
</html>

jQuery AJAX POST 请求

<!DOCTYPE html>
<html>
<head><title>jQuery AJAX POST 示例</title><!-- 1. 引入jQuery库 --><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body><!-- 2. 创建一个表单,包含要发送的数据 --><form id="myForm"><input type="text" name="username" placeholder="用户名" /><input type="password" name="password" placeholder="密码" /><button type="submit">提交</button></form><!-- 3. 创建一个用于展示AJAX返回数据的区域 --><div id="response"></div><script type="text/javascript">// 4. 文档准备就绪后执行代码$(document).ready(function() {// 5. 为表单添加提交事件监听器$('#myForm').submit(function(event) {// 6. 阻止表单的默认提交行为event.preventDefault();// 7. 获取表单数据var formData = $(this).serialize(); // 序列化表单数据// 8. 使用$.ajax()方法发起POST请求$.ajax({url: 'https://api.example.com/login', // 9. 指定请求的URLmethod: 'POST', // 10. 指定HTTP请求方法data: formData, // 11. 发送的数据success: function(response) { // 12. 成功回调函数,当请求成功时调用// 13. 更新页面上的内容$('#response').html('登录成功!欢迎 ' + response.username);},error: function(jqXHR, textStatus, errorThrown) { // 14. 错误回调函数,当请求失败时调用// 15. 处理可能发生的错误console.error('登录失败:', textStatus, errorThrown);$('#response').html('登录失败,请重试');}});});});</script>
</body>
</html>

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

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

相关文章

Ubuntu 下载安装 kibana8.7.1

来到 Kibana 和 Es 的版本兼容性列表根据自己的 Es 版本选择合适的 Kibana 版本&#xff1a; https://github.com/elastic/kibana#version-compatibility-with-elasticsearch 尽量让 Kibana 的版本和 Es 的版本保持一致。 来到 Kibana 的版本发布历史页面&#xff1a;https:/…

【PPTist】批注、选择窗格

前言&#xff1a;本篇文章研究批注和选择窗格两个小功能 一、批注 批注功能就是介个小图标 点击可以为当前页的幻灯片添加批注&#xff0c;还能删除之前的批注 如果我们增加了登录功能&#xff0c;还可以在批注上显示当前的用户名和头像&#xff0c;不过现在是写死的。 左侧…

【docker系列】可视化Docker 管理工具——Portainer

1. 介绍 Portainer是一个可视化的Docker操作界面&#xff0c;提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作&#xff08;包括上传下载镜像&#xff0c;创建容器等操作&#xff09;、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录…

Chrome访问https页面显示ERR_CERT_INVALID,且无法跳过继续访问

在访问网页的时候&#xff0c;因为浏览器自身的安全设置问题&#xff0c; 对于https的网页访问会出现安全隐私的提示&#xff0c; 甚至无法访问对应的网站&#xff0c;尤其是chrome浏览器&#xff0c; 因此本文主要讲解如何设置chrome浏览器的设置&#xff0c;来解决该问题&…

《Opencv》信用卡信息识别项目

目录 一、项目介绍 二、数据材料介绍 1、模板图片&#xff08;1张&#xff09; 2、需要处理的信用卡图片&#xff08;5张&#xff09; 三、实现过程 1、导入需要用到的库 2、设置命令行参数 3、模板图像中数字的定位处理 4、信用卡图像处理 5、模板匹配 四、总结 一…

Android NDK开发实战之环境搭建篇(so库,Gemini ai)

文章流程 音视频安卓开发首先涉及到ffmpeg编译打包动态库&#xff0c;先了解动态库之间的cpu架构差异性。然后再搭建可运行的Android 环境。 So库适配 ⽇常开发我们经常会使⽤到第三库&#xff0c;涉及到底层的语⾳&#xff0c;视频等都需要添加so库。⽽so库的体积⼀般来说 ⾮…

机器学习笔记 - 单幅图像深度估计的最新技术

1、深度估计简述 单眼深度估计是一项计算机视觉任务,AI 模型从单个图像中预测场景的深度信息。模型估计场景中对象从一个照相机视点的距离。单目深度估计已广泛用于自动驾驶、机器人等领域。深度估计被认为是最困难的计算机视觉任务之一,因为它要求模型理解对象及其深度信息之…

.NET AI 开发人员库 --AI Dev Gallery简单示例--问答机器人

资源及介绍接上篇 nuget引用以下组件 效果展示&#xff1a; 内存和cpu占有&#xff1a; 代码如下&#xff1a;路径换成自己的模型路径 模型请从上篇文尾下载 internal class Program{private static CancellationTokenSource? cts;private static IChatClient? model;privat…

PostgreSQL学习笔记(二):PostgreSQL基本操作

PostgreSQL 是一个功能强大的开源关系型数据库管理系统 (RDBMS)&#xff0c;支持标准的 SQL 语法&#xff0c;并扩展了许多功能强大的操作语法. 数据类型 数值类型 数据类型描述存储大小示例值SMALLINT小范围整数&#xff0c;范围&#xff1a;-32,768 到 32,7672 字节-123INTE…

Leffa 虚拟试衣论文笔记

Leffa: Learning Flow Fields in Attention for Controllable Person Image Generation https://github.com/xuanandsix/awesome-virtual-try-on-note/tree/main/Leffa 打开链接查看详情&#xff0c;更多虚拟试穿论文持续更新。

06-RabbitMQ基础

目录 1.初识MQ 1.1.同步调用 1.2.异步调用 1.3.技术选型 2.RabbitMQ 2.1.安装 2.2.收发消息 2.2.1.交换机 2.2.2.队列 2.2.3.绑定关系 2.2.4.发送消息 2.3.数据隔离 2.3.1.用户管理 2.3.2.virtual host 3.SpringAMQP 3.1.导入Demo工程 3.2.快速入门 3.2.1.消…

阻抗(Impedance)、容抗(Capacitive Reactance)、感抗(Inductive Reactance)

阻抗&#xff08;Impedance&#xff09;、容抗&#xff08;Capacitive Reactance&#xff09;、感抗&#xff08;Inductive Reactance&#xff09; 都是交流电路中描述电流和电压之间关系的参数&#xff0c;但它们的含义、单位和作用不同。下面是它们的定义和区别&#xff1a; …

【网络协议】IPv4 地址分配 - 第二部分

前言 在第 1 部分中&#xff0c;我们学习了 IPv4 地址的分配方式&#xff0c;了解了各种类型的 IPv4 地址&#xff0c;并进行了基础的子网划分&#xff08;Subnetting&#xff09;。在第 2 部分中&#xff0c;我们将继续学习子网划分&#xff0c;并引入一些新的概念。 【网络…

Linux 正则表达式 ⑪

正则表达式 1.Linux grep 命令 Linux grep (global regular expression) 命令用于查找文件里符合条件的字符串或正则表达式。 grep 指令用于查找内容包含指定的范本样式的文件&#xff0c;如果发现某文件的内容符合所指定的范本样式&#xff0c;预设 grep 指令会把含有范本样…

二、模型训练与优化(1):构建并训练模型

目录 1. 安装 Anaconda&#xff08;推荐&#xff09; 步骤&#xff1a; 2. 创建并激活虚拟环境 步骤&#xff1a; 3. 安装必要的库 步骤&#xff1a; 4. 编写训练脚本 步骤&#xff1a; 5. 运行训练脚本 步骤&#xff1a; 总结&#xff1a; 在完成了准备工作的基础上…

JavaEE初阶——计算机工作原理

一、什么是JavaEE JavaEE&#xff08;Java Platform&#xff0c;Enterprise Edition&#xff09;是sun公司&#xff08;2009年4月20日甲骨文将其收购&#xff09;推出的企业级应用程序版本。这个版本以前称为 J2EE。能够帮助我们开发和部署可移植、健壮、可伸缩且安全的服务器…

医学图像分析工具02:3D Slicer || 医学影像可视化与分析工具 支持第三方插件

3D Slicer 是一款功能全面的开源医学影像分析软件&#xff0c;广泛应用于影像处理、三维建模、影像配准和手术规划等领域。它支持多种医学影像格式&#xff08;如 DICOM、NIfTI&#xff09;和丰富的插件扩展&#xff0c;是神经科学、放射学和生物医学研究中不可或缺的工具。 在…

STM32裸机开发转FreeRTOS教程

目录 1. 简介2. RTOS设置&#xff08;1&#xff09;分配内存&#xff08;2&#xff09;查看任务剩余空间&#xff08;3&#xff09;使用osDelay 3. 队列的使用&#xff08;1&#xff09;创建队列&#xff08;1&#xff09;直接传值和指针传值&#xff08;2&#xff09;发送/接收…

使用高云小蜜蜂GW1N-2实现MIPI到LVDS(DVP)转换案例分享

作者&#xff1a;Hello&#xff0c;Panda 大家晚上好&#xff0c;熊猫君又来了。 今天要分享的是一个简单的MIPI到LVDS&#xff08;DVP&#xff09;接口转换的案例。目的就是要把低成本FPGA的应用潜力充分利用起来。 一、应用背景 这个案例的应用背景是&#xff1a;现在还在…

Express 加 sqlite3 写一个简单博客

例图&#xff1a; 搭建 命令&#xff1a; 前提已装好node.js 开始创建项目结构 npm init -y package.json:{"name": "ex01","version": "1.0.0","main": "index.js","scripts": {"test": &q…