重学Ajax

news2024/11/24 4:21:55

概述

 Ajax(Asynchronous JavaScript And XML)即异步 JavaScript 和 XML,是一组用于在网页上进行异步数据交换的Web开发技术,可以在不刷新整个页面的情况下向服务器发起请求并获取数据,然后将数据插入到网页中的某个位置。这种技术能够实现增量式更新页面,提高用户交互体验,减少响应时间和带宽的消耗。

使用 Ajax 技术,可以通过 JavaScript 和 XMLHttpRequest 对象来向服务器获取数据。在Ajax请求的过程中,可以通过定义回调函数来对请求的结果进行处理,回调函数会在请求完成后执行,通过这种方式可以更新页面内容或者响应用户操作。

Ajax 可以用来实现以下功能:

  • 异步更新页面内容(如搜索建议、聊天框等)
  • 在页面中特定区域显示动态数据
  • 提交表单数据而无需刷新整个页面
  • 与服务器进行交互,不会导致页面跳转或刷新

Ajax 的主要优点包括:

  • 提高用户体验:通过减少页面的重载和刷新,使得网站变得更加灵活和动态。
  • 减轻服务器负载:通过使用 Ajax,可以有效减少服务器接收到的请求次数和需要响应的数据量,从而减轻服务器的负担。
  • 提高响应速度:使用 Ajax 可以异步获取数据并更新页面,从而提高响应速度。
  • 增加交互性:通过使用 Ajax,可以使得页面变得更加动态和交互性。

然而也需要注意一些问题:

  • Ajax 对搜索引擎优化(Seo)劣势较大,对于需要SEO的项目需要谨慎选择使用Ajax技术。
  • 在使用 Ajax 时,需要考虑数据安全性和网络安全性问题,并采取相应的措施加以防范。
  • 不合适的使用 Ajax,可能会造成降低网站质量和效率的问题,所以需要根据实际需求来决定是否采用该技术。

文档

developer.mozilla.org/zh-CN/docs/…

核心API

1.需要创建xhr实例 通过 XMLHttpRequest 使用 XMLHttpRequest 可以通过 JavaScript 发起HTTP请求,接收来自服务器的响应,并动态地更新网页中的内容。这种异步通信方式不会阻塞用户界面,有利于增强用户体验。

2.我们需要使用 open() 方法打开一个请求,该方法会初始化一个请求,但并不会发送请求。它有三个必填参数以及一个可选参数

  • method:请求的 HTTP 方法,例如 GET、POST 等。
  • url:请求的 URL 地址。
  • async:是否异步处理请求,默认为 true,即异步请求。

3.onreadystatechange 一个回调函数,在每次状态发生变化时被调用。

  • readyState 0:未初始化,XMLHttpRequest 对象已经创建,但未调用 open 方法。
  • readyState 1:已打开,open 方法已经被调用,但 send 方法未被调用。
  • readyState 2:已发送,send 方法已经被调用,请求已经被服务器接收。
  • readyState 3:正在接收,服务器正在处理请求并返回数据。
  • readyState 4:完成,服务器已经完成了数据传输。

4.send 向后端传递参数 例如 xhe.send(params)

案例

发送一个get 请求

在 XMLHttpRequest 对象中,onload 事件是指在 AJAX 请求成功完成后所触发的事件。当异步请求成功返回响应时,该事件会被调用,可以在该事件中处理服务器返回的数据。

使用 XMLHttpRequest 对象时,在调用 send() 方法发送请求后,会监听readystatechange 事件,该事件会在请求过程中多次触发,它有多个状态,其中,当该对象 readyState 状态码值为4时表示已经获取到服务器的响应信息。但是只有当 HTTP 状态码为 200(OK)时,响应才是有效的。此时,你可以通过响应结果来更新页面,反之则应该进行错误处理。

使用 onload 事件可以更加直接地判断 AJAX 请求是否成功,只有在响应成功(即获得正确的 HTTP 状态码)时才会触发,并且无需判断服务器响应的状态码。可以在 onload 事件中处理服务器返回的数据,并根据需要更新网页内容。

const xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:3000/api/txt')
xhr.onload = function() {
  if (xhr.status === 200) {
        document.querySelector('#result').innerText = xhr.responseText;
    }
    else {
       console.log('Request failed.  Returned status of ' + xhr.status);
   }
};
xhr.send(null);

发送post 请求 json

const xhr = new XMLHttpRequest();
xhr.open('POST', 'http://localhost:3000/api/post')
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onload = function() {
  if (xhr.status === 200) {
        document.querySelector('#result').innerText = xhr.responseText;
    }
    else {
       console.log('Request failed.  Returned status of ' + xhr.status);
   }
};
xhr.send(JSON.stringify({name: 'zhangsan', age: 18}));

发送post 请求 application/x-www-form-urlencoded

const xhr = new XMLHttpRequest();
xhr.open('POST', 'http://localhost:3000/api/post')
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload = function() {
  if (xhr.status === 200) {
        document.querySelector('#result').innerText = xhr.responseText;
    }
    else {
       console.log('Request failed.  Returned status of ' + xhr.status);
   }
};
xhr.send('name=zhangsan&age=18');

上传图片 multipart/form-data

浏览器会自动设置请求头为 multipart/form-data

并且浏览器会自动添加 boundary 分割线

document.querySelector('#file').addEventListener('change', function () {
    const xhr = new XMLHttpRequest();
    xhr.open('POST', 'http://localhost:3000/api/upload')
    xhr.onload = function () {
        if (xhr.status === 200) {
            document.querySelector('#result').innerText = xhr.responseText;
        }
        else {
            console.log('Request failed.  Returned status of ' + xhr.status);
        }
    };

    let file = this.files[0];
    let formData = new FormData();
    formData.append('file', file);
    xhr.send(formData);
});

中断请求 和 设置超时时间

中断请求只需要调用 xhr.abort(); 即可

并且会有一个中断的回调

xhr.addEventListener('abort', function (event) { console.log('我被中断了'); });

超时时间可以设置timeout 参数

xhr.timeout = 3000;

同样有一个超时回调

xhr.addEventListener('timeout', function (event) { console.log('超时啦'); });

获取进度

可以监听 progress

在监听器中,我们通过 event.loaded 和 event.total 属性获取已上传数据量和总数据量,并计算上传进度,最后将进度显示在页面上

 
xhr.addEventListener('progress', function (event) {
document.querySelector('#progress').innerText = `${(event.loaded / event.total * 100).toFixed(2)}%`;
});

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

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

相关文章

【Docker】Swarm学习

文章目录 什么是Docker Swarm定义与Docker Compose对比 基本结构图关键概念工作模式NodeService任务与调度服务副本与全局服务 Swarm的调度策略Swarm的特性批量创建服务强大的集群的容错性服务节点的可扩展性调度机制 集群部署基础架构准备工作创建Swarm并添加节点在Swarm中部署…

测试进阶篇

✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录 按照对象划分界面测试可靠性测试容错性测试文档测试兼容性测试易用性测试安装卸载测试安全测试性能测试内存泄漏测试 按是否查…

老板让你Excel统计数据无从下手?没事,ChatGPT来帮你!

系列文章目录 老板让你写个PPT没有头绪?没事,ChatGPT来帮你!传送门 文章目录 系列文章目录前言一、不会公式?帮你生成二、不会处理数据?帮你处理写在最后 前言 自从人工智能横空而出,它在人们的生活中产生…

如何在华为OD机试中获得满分?Java实现【 第一个错误的版本】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

【P36】JMeter 交替控制器(Interleave Controller)

文章目录 一、交替控制器(Interleave Controller)参数说明二、测试计划设计 一、交替控制器(Interleave Controller)参数说明 可以将内部的组件在线程迭代时交替执行;交替控制器内部一般会有多个取样器 选择线程组右…

6.6.4 PCS创建Oracle 资源及资源组

在RHCS体系中,Oracle的启动是按以下顺序进行的: VIP。监听器。逻辑卷(ISCSI共享出来的)。文件系统(在逻辑卷上创建)。数据库实例。 上边这些资源,在PCS里创建好以后,将其组合成一个…

接口自动化一键集成,Jenkins持续集成Allure报告!

目录 前言: 一、接口测试框架选型 二、接口自动化框架封装的设计 2.1 创建测试用例 2.2 执行测试用例 2.3 生成测试报告 三、 实现Jenkins持续集成 3.1 安装Jenkins 3.2 配置Jenkins 3.3 创建Jenkins任务 四、总结 前言: 接口测试作为软件测试中的…

chatgpt赋能python:Python程序中断

Python 程序中断 Python 是一种高级编程语言,被广泛应用于数据科学和机器学习等领域。但是,有时候我们需要中断 Python 程序的执行,以便处理意外事件或者出现错误时进行调试。在这篇文章中,我们将探讨 Python 程序中断的各种方法…

Rocky9-Linux上安装KVM虚拟机

一、案例环境 使用一台物理机器,安装Rocky9-Linux的64位系统,test01是在宿主机kvm中安装的虚拟机 主机 操作系统 IP地址 主要软件 kvm Centos 7 192.168.100.46 KVM test01 Centos 7 192.168.100.32 虚拟机

梅须逊雪三分白,雪却输梅一段香——CSS动画与JavaScript动画

CSS动画并不是绝对比JavaScript动画性能更优越,开源动画库Velocity.js等就展现了强劲的性能。 一、两者的主要区别 先开门见山的说说两者之间的区别。 1)CSS动画: 基于CSS的动画一般由浏览器“主线程”之外的独立线程处理,在其…

SpringBoot2-核心技术(一)

SpringBoot2-核心技术(一) 了解SpringBoot配置文件的使用 文章目录 SpringBoot2-核心技术(一)了解SpringBoot配置文件的使用一、文件类型1. properties2. yaml 二、yaml的基本使用1. 基本语法2. 数据类型2.1 字面量 2.2 对象2.3 …

Ubuntu系统磁盘分区与挂载

0x00、一些查看信息的命令 sudo fdisk -l 该命令可以列出当前设备上的所有分区表信息。 df -hl 该命令可以查看文件系统磁盘空间的使用情况。 0x01、对磁盘分区 使用命令 sudo fdisk 设备文件名(/dev/sda) 此处设备路径可以通过上面的fdisk -l命令查看…

测试老鸟总结,性能测试三大核心指标详解,并发/TPS/响应时间...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 抛出问题&#xf…

恒容容器放气的瞬时流量的计算

有时候,你会遇到一个问题,该问题的描述如下: 你有一个已知体积的容器,设容器体积为V,里面装有一定压力(初始压力)的气体,如空气或氢气等,设初始压力为1MPa,容器出口连接着一个阀门开…

服务(第三十一篇)mysql-mmm高可用

MMM是一套支持双主故障切换和双主日常管理的脚本程序。 用来监控和管理 MySQL Master-Master (双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加…

Makefile基础教程(自动生成依赖关系)

文章目录 前言一、makefile不包含.h依赖的后果二、gcc -M 和 gcc -MM命令三、sed命令四、makefile中命令的执行机制四、生成依赖文件并单独放入文件夹中总结前言 在前面的文章中我们都只使用到了.c文件作为依赖但是在实际的工程中肯定是不可能只有.c文件的还存在.h文件,那么在…

CSAPP Lab5- MallocLab

实验目标 本实验需要用c语言实现一个动态的存储分配器,也就是你自己版本的malloc,free,realloc函数。 实验步骤 tar xvf malloclab-handout.tar解压文件 我们需要修改的唯一文件是mm.c,包含如下几个需要实现的函数 int mm_ini…

ChatGPT通用人工智能:初心与未来

至少从 20 世纪 50 年代起,人们就开始大肆宣传可能很快就会创造出一种能够与人类智能的全部范围和水平相匹配的机器。现在,我们已经成功地创造出了能够解决特定问题的机器,其准确度达到甚至超过了人类,但我们仍然无法获得通用智能…

基于STM32F103的HAL库手动配置FreeRTOS

基于STM32F103的HAL库手动配置FreeRTOS 源码下载 FreeRTOS源码下载包括示例工程与内核工程。 示例工程:获取与开发环境相关的架构文件 内核工程:移植FreeRTOS的内核文件 示例工程Gitee地址 内核工程GirHub地址 STM32工程创建 使用STM32CubeMX创建新工…

电动汽车变频器

目录 1、电动汽车与汽油动力车的区别 2、变频器 3、变频器内元件 3.1、汽车变频器的组成和功能 3.1.1、电容器 3.1.2、变频器控制单元 3.1.3、逆变桥驱动单元 3.1.4、逆变桥单元 3.2、汽车上变频器的组成和功能 3.2.1、DC/DC升压转换器。 3.2.2、DC/DC降压转换器。 …