AJAX原理解析与案例实践,助你成为前端技术高手

 大家有关于JavaScript知识点不知道可以去

🎉博客主页:阿猫的故乡

🎉系列专栏:JavaScript专题栏

🎉ajax专栏:ajax知识点

🎉欢迎关注:👍点赞🙌收藏✍️留言

学习目标:

AJAX 原理


学习内容:

XMLHttpRequest
Promise

封装简易版 axios


学习时间:

提示:这里可以添加计划学习的时间

例如:

  • 周一至周五晚上 7 点—晚上9点
  • 周六上午 9 点-上午 11 点
  • 周日下午 3 点-下午 6 点

学习产出:

AJAX原理 - XMLHttpRequest

定义:

XMLHttpRequest是一种在Web开发中使用的API,用于进行异步通信。它是AJAX(Asynchronous JavaScript and XML)的核心组件之一。XMLHttpRequest对象可以在不影响页面的情况下,向服务器发送HTTP请求并接收服务器返回的数据。

XMLHttpRequest对象首先由Microsoft在Internet Explorer中引入,后来被其他浏览器所采纳并成为标准的一部分。尽管其名称中包含"XML",但它实际上可以与各种数据格式一起使用,例如HTML、文本、JSON等。

通过XMLHttpRequest对象,开发人员可以实现以下功能:

  1. 异步加载数据:XMLHttpRequest可以在后台向服务器发送请求并从服务器接收数据。这样,在页面加载时,可以同时进行其他操作而不会阻塞用户界面。
  2. 更新部分页面内容:通过XHR可以向服务器请求特定的数据,并将其插入到页面的特定区域,而不需要重新加载整个页面。这样可以实现动态更新部分内容的效果。
  3. 发送数据到服务器:除了从服务器获取数据,XHR还可以用于将数据发送到服务器,例如提交表单数据或者将用户输入保存到数据库中。

XMLHttpRequest对象具有多个属性和方法,使开发人员可以对请求进行设置、发送请求、处理响应数据等。通过使用这些属性和方法,可以实现高度定制的异步通信。

总结来说,XMLHttpRequest是一种用于发送异步HTTP请求并处理响应的JavaScript API。它是AJAX技术的基础,使得在Web应用中可以实现更加流畅和动态的用户体验。

关系:axios 内部采用 XMLHttpRequest 与服务器交互
好处:掌握使用 XHR 与服务器进行数据交互,了解 axios 内部原理

使用 XMLHttpRequest

要使用XMLHttpRequest对象进行异步通信,需要按照以下步骤进行操作:

  1. 创建XMLHttpRequest对象:

    var xhr = new XMLHttpRequest();
    

  2. 设置请求的相关参数:

    • 指定请求的方法(GET、POST等)和URL:
      xhr.open('GET', 'http://example.com/api/data', true);
      

    • 可选:指定请求的头信息(例如设置请求的Content-Type):
      xhr.setRequestHeader('Content-Type', 'application/json');
      

  3. 注册事件处理程序:

    • 指定当请求完成时调用的回调函数:
      xhr.onload = function() {
        // 响应已完成
        if (xhr.status === 200) {
          // 请求成功
          console.log(xhr.responseText);
        } else {
          // 请求失败
          console.error('请求失败:' + xhr.status);
        }
      };
      

    • 可选:指定在请求过程中发生错误时调用的回调函数:
      xhr.onerror = function() {
        console.error('请求发生错误');
      };
      

  4. 发送请求:

    xhr.send();
    

在发送请求之后,XHR对象会与服务器进行通信,并在完成后触发相应的事件处理程序。可以使用xhr.responseText访问服务器返回的响应数据。如果请求失败,可以使用xhr.status来获取错误状态码。

需要注意的是,由于安全原因,存在跨域限制。如果请求的URL与当前页面的域名不同,可能会受到浏览器的限制。可以使用CORS(跨域资源共享)或JSONP等技术来解决跨域问题。

这只是XMLHttpRequest的基本用法,还有其他更高级的功能,例如设置请求超时、上传文件等。可以查阅更多文档或教程来深入了解XMLHttpRequest的更多用法和功能。

 总结:

步骤:
1. 创建 XMLHttpRequest 对象
2. 配置请求方法和请求 url 地址
3. 监听 loadend 事件,接收响应结果
4. 发起请求

XMLHttpRequest - 查询参数

XMLHttpRequest对象通常用于发送异步请求,并从服务器获取数据。查询参数是在URL中传递的参数,用于向服务器发送特定的请求信息。

可以通过将查询参数附加到URL中来发送数据。以下是使用XMLHttpRequest对象发送具有查询参数的请求的示例:

var xhr = new XMLHttpRequest();
var url = 'http://example.com/api/data?param1=value1¶m2=value2';

xhr.open('GET', url, true);

xhr.onload = function() {
  if (xhr.status === 200) {
    console.log(xhr.responseText);
  } else {
    console.error('请求失败:' + xhr.status);
  }
};

xhr.onerror = function() {
  console.error('请求发生错误');
};

xhr.send();

在上述示例中,URL中的查询参数是通过在URL末尾使用?&添加的。每个查询参数由键值对组成,使用等号(=)分隔,键和值之间使用&分隔。示例中的URL将param1=value1和`param

需求:通过 XHR 提交用户名和密码,完成注册功能
核心:
请求头设置 Content-Type:application/json
请求体携带 JSON 字符串

下面是一个示例代码,演示如何通过XHR提交用户名和密码完成注册功能:

var xhr = new XMLHttpRequest();

// 设置请求方法和URL
xhr.open('POST', 'http://example.com/register', true);

// 设置请求头
xhr.setRequestHeader('Content-Type', 'application/json');

// 构建请求体
var data = {
  username: 'john',
  password: 'password123'
};

// 发送请求
xhr.send(JSON.stringify(data));

// 监听请求完成事件
xhr.onload = function() {
  if(xhr.status === 200) {
    console.log('注册成功');
  } else {
    console.log('注册失败');
  }
}

请根据实际情况修改请求的URL和请求体数据。

Promise

定义

Promise是JavaScript中处理异步操作的一种方式,它可以更方便地管理和处理异步代码。Promise有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)。

Promise的语法如下:

new Promise(function(resolve, reject) {
  // 异步操作的代码
  // 成功时调用 resolve(),并传递结果数据
  // 失败时调用 reject(),并传递错误信息
}).then(function(result) {
  // 成功时的处理逻辑
}).catch(function(error) {
  // 失败时的处理逻辑
});

在Promise的构造函数中,我们可以执行异步操作。如果异步操作成功,调用resolve()方法,并传递成功的结果数据;如果异步操作失败,调用reject()方法,并传递错误信息。

then()方法中,我们可以处理异步操作成功时的情况。then()方法接收一个函数作为参数,该函数的参数是异步操作成功的结果数据。

catch()方法中,我们可以处理异步操作失败时的情况。catch()方法接收一个函数作为参数,该函数的参数是异步操作失败的错误信息。

Promise还有一些其他的方法和特性,如resolve()reject()all()race()等,可以更灵活地处理异步操作。

请注意,Promise是ES6中的特性,如果要在老旧的浏览器环境中使用,可能需要使用Polyfill库补充支持。

 总结:

1. 什么是 Promise?
➢ 表示(管理)一个异步操作最终状态和结果值的对象
2. 为什么学习 Promise?
➢ 成功和失败状态,可以关联对应处理程序
➢ 了解 axios 内部原理
3. Promise 使用步骤?

Promise - 三种状态
作用:了解Promise对象如何关联的处理函数,以及代码执行顺序
概念:一个Promise对象,必然处于以下几种状态之一
✓ 待定(pending) :初始状态,既没有被兑现,也没有被拒绝
✓ 已兑现(fulfilled) :意味着,操作成功完成
✓ 已拒绝(rejected) :意味着,操作失败

 

总结:

1. Promise 对象有哪 3 种状态?
➢ 待定 pending
➢ 已兑现 fulfilled
➢ 已拒绝 rejected
2. Promise 状态有什么用?
➢ 状态改变后,调用关联的处理函数

封装简易版 axios 

 封装_简易axios_获取省份列表

 需求:基于 Promise + XHR 封装 myAxios 函数,获取省份列表展示
步骤:
1. 定义 myAxios 函数,接收配置对象,返回 Promise 对象
2. 发起 XHR 请求,默认请求方法为 GET
3. 调用成功/失败的处理程序
4. 使用 myAxios 函数,获取省份列表展示

以下是基于Promise和XHR封装的myAxios函数来获取省份列表并展示的代码示例:

function myAxios(config) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open(config.method || 'GET', config.url, true);

    xhr.onreadystatechange = function() {
      if (xhr.readyState === 4) {
        if (xhr.status === 200) {
          resolve(JSON.parse(xhr.responseText));
        } else {
          reject(new Error(xhr.statusText));
        }
      }
    };

    if (config.headers) {
      for (let header in config.headers) {
        xhr.setRequestHeader(header, config.headers[header]);
      }
    }

    xhr.send();
  });
}

// 使用myAxios函数来获取省份列表并展示
const url = 'https://api.apiopen.top/getAllUrl';

myAxios({ url })
  .then(response => {
    console.log(response);
    // 在这里展示省份列表
  })
  .catch(error => {
    console.error('Error:', error);
  });

这段代码定义了一个myAxios函数,它接收一个配置对象作为参数,并返回一个Promise对象。在函数内部,通过XMLHttpRequest对象来发送XHR请求,并监听其状态变化。在请求成功时,解析响应的文本并将结果传递给resolve方法;在请求失败时,将错误信息传递给reject方法。

在代码的后面部分,我们使用myAxios函数来发送GET请求获取省份列表,并在成功时打印出返回的数据。你可以根据具体需求,对返回的数据进行展示。

 需求:修改 myAxios 函数支持传递查询参数,获取"河北省","邯郸市"对应地区列表展示
步骤:
1. myAxios 函数调用后,判断 params 选项
2. 基于 URLSearchParams 转换查询参数字符串
3. 使用自己封装的 myAxios 函数展示地区列表

以下是修改后的myAxios函数,支持传递查询参数,并获取"河北省","邯郸市"对应的地区列表进行展示:

function myAxios(config) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    let url = config.url;

    // 如果有查询参数,则转换为字符串并拼接到URL上
    if (config.params) {
      const params = new URLSearchParams(config.params);
      url += '?' + params.toString();
    }

    xhr.open(config.method || 'GET', url, true);

    xhr.onreadystatechange = function() {
      if (xhr.readyState === 4) {
        if (xhr.status === 200) {
          resolve(JSON.parse(xhr.responseText));
        } else {
          reject(new Error(xhr.statusText));
        }
      }
    };

    if (config.headers) {
      for (let header in config.headers) {
        xhr.setRequestHeader(header, config.headers[header]);
      }
    }

    xhr.send();
  });
}

// 使用myAxios函数来获取地区列表并展示
const url = 'https://api.apiopen.top/getArea';

myAxios({ 
  url,
  params: {
    province: '河北省',
    city: '邯郸市'
  }
})
  .then(response => {
    console.log(response);
    // 在这里展示地区列表
  })
  .catch(error => {
    console.error('Error:', error);
  });

在这段代码中,我们对myAxios函数进行了修改,添加了对查询参数的支持。在调用myAxios函数时,可以通过params选项传递查询参数。我们使用URLSearchParams对象将查询参数转换为字符串,并拼接到URL上。

在请求地区列表时,我们传递了查询参数province为"河北省",city为"邯郸市"。在请求成功后,可以在then方法中处理返回的地区列表数据,并进行展示。

 需求:修改 myAxios 函数支持传递请求体数据,完成注册用户功能
步骤:
1. myAxios 函数调用后,判断 data 选项
2. 转换数据类型,在 send 方法中发送
3. 使用自己封装的 myAxios 函数完成注册用户功能

以下是修改后的myAxios函数,支持传递请求体数据,并完成注册用户功能:

function myAxios(config) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open(config.method || 'GET', config.url, true);

    xhr.onreadystatechange = function() {
      if (xhr.readyState === 4) {
        if (xhr.status === 200) {
          resolve(JSON.parse(xhr.responseText));
        } else {
          reject(new Error(xhr.statusText));
        }
      }
    };

    if (config.headers) {
      for (let header in config.headers) {
        xhr.setRequestHeader(header, config.headers[header]);
      }
    }

    if (config.method === 'POST' && config.data) {
      xhr.setRequestHeader('Content-Type', 'application/json');
      xhr.send(JSON.stringify(config.data));
    } else {
      xhr.send();
    }
  });
}

// 使用myAxios函数来完成注册用户功能
const url = 'https://api.apiopen.top/registerUser';

myAxios({
  url,
  method: 'POST',
  data: {
    username: 'testuser',
    password: 'testpassword'
  }
})
  .then(response => {
    console.log(response);
    // 在这里处理注册成功的逻辑
  })
  .catch(error => {
    console.error('Error:', error);
  });

在这段代码中,我们对myAxios函数进行了修改,增加了对data选项的支持。在调用myAxios函数时,可以通过data选项传递请求体数据。在发送POST请求时,我们将请求头设置为'Content-Type: application/json',并将数据转换为JSON字符串后发送。

在注册用户功能中,我们传递了请求体数据username为'testuser',password为'testpassword'。在请求成功后,可以在then方法中处理返回的响应数据,并进行相应的逻辑处理。

 以上就是全部的ajax原力知识点了 以上所有图均来自网络,如有侵权联系速删!!!

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

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

相关文章

微信开发者工具安装教程

文章目录 下载安装包执行安装包 #微信开发者工具安装教程 下载安装包 官网网址 执行安装包 D:\Program Files (x86)\Tencent\微信web开发者工具\dll

D92-02-ASEMI快恢复二极管20A 200V

编辑:ll D92-02-ASEMI快恢复二极管20A 200V 型号:D92-02 品牌:ASEMI 封装:TO-247 特性:插件、快恢复二极管 最大平均正向电流:20A 最大重复峰值反向电压:200V 恢复时间:35ns…

nodejs使用express框架启动服务操作mysql数据库

描述: 首先在本地搭建mysql数据库,配置:host: ‘192.168.3.249’,user: ‘mkx’,password: ‘123456’,database: ‘gg’.测试连接正常.使用express写两个接口, 1.查询所有学生的接口,使用的get请求,无参数. 2.插入一条学生信息,使用post请求,body是一个json的学生信息{name:“…

计算机组成原理——存储器21-40

21、存储器存取周期是指(C) A、存储器的读出时间 B、存储器的写入时间 C、存储器进行连续读或写操作所允许的最短时间间隔 D、存储器进行一次读或写操作所需的平均时间 存取周期是存储器进行连续读或写操作所允许的最短时间间隔 存取时间是存储器进行一次…

【面试】数据库—优化—聚簇索引和非聚簇索引、回表查询

数据库—优化—聚簇索引和非聚簇索引、回表查询 1. 什么是聚簇索引什么是非聚簇索引 ? 聚集索引选取规则: 如果存在主键,主键索引就是聚集索引;如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引&#xff1b…

Geek challenge 2023 EzHttp

打开链接需要使用post请求提交username和password 查看源码得到提示,爬虫想到robots协议 访问robots.txt 访问得到的路径:/o2takuXXs_username_and_password.txt 拿到用户名和密码: username:admin password:dm1N123456r00t# 进行post传参…

Windows 和 MacOS 上安装配置ADB(安卓调试桥)

一、Android 调试桥 (ADB) Android 调试桥(ADB) 是一款多功能命令行工具,它让你能够更便捷地访问和管理 Android 设备。使用 ADB 命令,你可以轻松执行以下操作 在设备上安装、复制和删除文件;安装应用程序&#xff1…

HTTP与HTTTPS的区别

目录 一、HTTP和HTTTPS的概念 HTTP(Hypertext Transfer Protocol): HTTPS(Hypertext Transfer Protocol Secure): 二、HTTP 的 get 请求和 post 请求的区别? 三、HTTPS 的工作原理&#xff…

07.CSS常用样式

CSS常用样式 1.颜色样式 颜色名 介绍 直接使用颜色对应的英文单词,编写比较简单 具体颜色名参考 MDN 官方文档 例子 p {color:red; }缺点 颜色名这种方式,表达的颜色比较单一,所以用的并不多 rgb或rgba 介绍 使用 红、黄、蓝 这三…

Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看所…

水闸水雨情监测设施建设项目

功能设计 在水闸上、下游挡墙外侧各安装1套雷达水位计,水闸屋顶布置个雨量计,水位及雨量监测数据的采集与传输主要是实时的完成水位、雨量数据的采集与处理,并按照设定的工作方式、时间间隔、增量范围将数据上传至扬压力监测站边缘计算终端&…

EasyExcel实现⭐️本地excel数据解析并保存到数据库的脚本编写,附案例实现

目录 前言 一、 EasyExcel 简介 二、实战分析 1.Controller控制层 2. service方法和方法实现 3.EasyExcel相关类 3.1 excel表实体类 3.2 自定义监听器类 4.测试 4.1 准备工作 4.2 断点调试 5.生成脚本文件 三、分析总结 章末 小伙伴们大家好,最近开发的时…

微服务最佳实践:构建可扩展且高效的系统

微服务架构彻底改变了现代软件开发,提供了无与伦比的敏捷性、可扩展性和可维护性。然而,有效实施微服务需要深入了解最佳实践,以充分发挥微服务的潜力,同时避免常见的陷阱。在这份综合指南中,我们将深入研究微服务的关…

getchar的功能和用法

getchar()是C语言中的一个标准库函数,用于从标准输入(通常是键盘)读取一个字符,并将其作为int类型返回。它通常用于从键盘获取用户输入。 getchar()函数在程序中等待用户输入,当用户输入一个字符并按下回车键后&#…

【抄作业】ubuntu完全卸载CUDA,彻底卸载cuda,卸载不同版本的cuda,cuda不同版本的卸载方法

卸载的实现方法 如何正确、完全的卸载cuda呢? 其实cuda安装时就已经准备好了卸载的接口,卸载程序在/usr/local/cuda-xx.x/bin下,需要注意的是cuda10.0及之前的版本卸载程序名为uninstall_cuda_xx.x.pl,而cuda10.1及之后的版本卸…

【玩转 TableAgent数据智能分析】-数据分析师的大模型

【玩转 TableAgent数据智能分析】-数据分析师的大模型 九章云极DataCanvas介绍TableAgent的新手入门指南:官网首页立刻体验问题测试问题1:问题2:问题3:问题4:问题5: 通用大模型对比分析对csv数据集的支持比…

【游戏篇】Scratch之小猴子接水果

【作品展示】小猴子接水果 操作:点击小绿旗,按下键盘左右键控制小猴子移动拿到水果,同时也要躲避炸弹。

Windows汇编调用printf

VS2022 汇编 项目右键 生成依赖项 生成自定义 勾选masm 链接器 高级 入口点 main X86 .686 .model flat,stdcall option casemap:none includelib ucrt.lib includelib legacy_stdio_definitions.libEXTERN printf:proc.data szFormat db %s,0 szStr db hello,0.code main…

Python Socket编程

Python Socket编程 文章目录 Python Socket编程1. 弄懂HTTP、Socket、TCP这几个概念五层网络模型 2. client和server实现通信Socket编程模式指南代码实现 3. socket实现聊天和多用户连接4. socket模拟http请求 1. 弄懂HTTP、Socket、TCP这几个概念 整个计算机网络都是有协议组…

leetcode算法题:省份数量

leetcode算法题547 链接:https://leetcode.cn/problems/number-of-provinces 题目 有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间…