Ajax 入门

Ajax 入门

简介

  • AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。
  • AJAX 不是新的编程语言,而是一种使用现有标准的新方法。
  • AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。
  • AJAX 需要用户允许 JavaScript 在浏览器上执行。

原理

在客户端(如浏览器)和服务器之间加了一个中间层:Ajax 引擎。由 Ajax 引擎独立向服务器请求数据,前端获取到 Ajax 返回的数据后,可以使用新数据来更新页面、或进行其它操作,使用户请求和服务器响应异步化,从而保证了在不刷新页面的前提下可以局部更新网页内容。

如果服务器端支持 CORS,可以通过设置 Access-Control-Allow-Origin 来实现跨域。如果浏览器检测到相应的设置,就会允许 Ajax 进行跨域访问


我暂时也不是很理解,不过不影响下面的使用😄

XML

我们注意到前面说过 Ajax = 异步的 Javascript 和 XML,那么什么是 XML 呢?

XML 指可扩展标记语言(extensible Markup Language)

如果你熟悉 HTML 的话,你也会对 XML 感到亲切。来看下面这段 XML 的写法

<role>
<name>刻晴</name>
<age>17</age>
<element>雷</element>
</role>

与 HTML 不一样的是,XML 中的标签名不是预定义的,而是自定义的,是由我们自己命名的。HTML 用于呈现页面的结构,而 XML 则被设计为被设计用来传输和存储数据。如果你了解 JSON 的话,上述 XML 代码等价于如下的 JSON 代码

{"name": "刻晴","age": 17,"element": "雷"
}

总之,XML 和 JSON 是存储传输数据的两种方法,而显然 JSON 的语法规则十分简单,可称得上“优雅完美”,同时生成和解析都很方便,现在 XML 已被 JSON 取代,所以我们下面通过 Ajax 传输的数据主要是 JSON 格式的。

简单地来说,使用 Ajax 就是我们通过 Javascript 向服务端发起 http 请求,服务端处理我们的请求并响应,响应的数据以 JSON 格式(也可以是字符串等其他格式)返回,我们再将返回的数据更新到我们的页面。

HTTP

使用 Ajax 之前我们必须什么是 HTTP 协议,如果你还不知道 HTTP 请求方式,HTTP 状态码,请自行上网搜索学习。
如果你想深入了解,这里有 HTTP 的中文 MDN 文档

Ajax 的使用

使用之前我们要知道,Ajax 用于客户端向服务端请求数据并实现页面的更新,为了测试我们写的 Ajax 代码,我们可能需要搭建一个服务端,比如使用express来搭建,但是这样有些麻烦,这里我们使用Swagger 开放接口,我们向这些接口发送请求即可得到响应的结果

开始写 Ajax 代码啦❤️

  1. 首先我们创建一个 html 文件,Ajax 代码将在 html 文件中 script 标签中书写。
    我们要实现的功能是点击获取名言的按钮,页面中会呈现一句名言。
    注意我们引入了 booststrap 用于美化我们的页面,不必过多关注
<!doctype html>
<html lang="zh-CN"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Ajax学习</title><!-- 引入bootstrap --><linkrel="stylesheet"href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"/></head><body><div class="container"><h1>每日名言</h1><button class="btn btn-info">获取名言</button><h2></h2></div><script></script></body>
</html>
  1. 使用 XMLHttpRequest 对象发送请求处理响应
// 创建XMLHttpRequest对象
const xhr = new XMLHttpRequest()
// 设置请求方法与请求地址
xhr.open('GET', 'https://api.apiopen.top/api/sentences')
// 发送请求
xhr.send()
// 接收响应数据
// xhr对象上有readyState这个属性,当它发生变化时就会调用onreadystatechange这个方法
xhr.onreadystatechange = function () {if (xhr.readyState === 4) {// status属性表示请求的状态码,如果是200表示请求成功if (xhr.status === 200) {// 使用JSON.parse将字符串转换成JSON对象const res = JSON.parse(xhr.responseText)console.log(res)document.querySelector('h2').innerHTML = res.result.name}}
}

以上是 Ajax 的基本使用

Ajax 使用补充

  1. open 方法

open 方法的完整格式是这样的:xhr.open(method, url, [async])

  • 第一个参数用于指定 HTTP 请求的方法,不区分大小写。
  • 第二个参数用于指定 HTTP 请求的 URL 地址,可以是 绝对 URL 或 相对 URL;
    绝对 URL 需要满足同源策略,除非服务端允许跨域请求。相对 URL 即是相对于文档的 URL。
  • 第三个参数可选,默认为 true,表示异步调用此次 Ajax 请求,不阻塞后续脚本的执行

open()方法其实还可以有第四、第五个参数,分别是用于 HTTP 请求访问认证的用户名和密码,使用它们需要在服务器做相应的配置,较为少用。

  1. send 方法

发送 GET 请求时,send 方法不需要传递参数(也可以传递 null)。发送 POST 时,数据可以通过 send 方法发送

const xhr = new XMLHttpRequest()
xhr.open('POST', 'login')
// 设置请求头
xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded;charset=UTF-8',
)
xhr.send('username=123&password=123456')
  1. readyState 属性

前面我们说过,readyState 是 XMLHttpRequest 对象上的一个属性,用于表示请求所处的状态。

  • 0:初始值,表示请求未初始化,open 方法尚未调用
  • 1:启动请求,open 方法已经调用,但尚未调用 send 方法
  • 2:请求发送,已经调用 send 方法,但尚未接收到响应
  • 3:接收响应,已经接受到部分响应数据,主要是响应头
  • 4:HTTP 响应完成,已经接收到全部响应数据,而且可以在客户端使用

每次 reaystate 属性值改变都会触发 reaystatechange 事件但只有 reaystate 属性值为 4 时才表示 HTTP 响应准备就绪

  1. 设置请求头
// 设置请求体内容的类型
xhr.setRequestHeader('Content-Type', 'application/x-www-from-urlencoded')
// 自定义头信息
xhr.setRequestHeader('name', 'ykyk')
  1. 请求超时和网络异常
// 超时设置 (2秒)
xhr.timeout = 2000
// 超时回调
xhr.ontimeout = function () {alert('网络超时,请稍后重试')
}
// 网络异常回调
xhr.onerror = function () {alert('网络异常,请稍后重试')
}
  1. 取消请求
// 手动取消
xhr.abort()
  1. 解决 IE 等浏览器的缓存问题

在一些浏览器中(如 IE),由于缓存机制的存在,对于相同的 URL,ajax 只会发送的第一次请求,剩余多次请求不会在发送给浏览器而是直接加载缓存中的数据。
解决的方法很简单,给 URL 添加赘余不重复的参数即可。

xhr.open('get', '/testAJAX?t=' + Date.now())

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

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

相关文章

C++ //练习 6.10 编写一个函数,使用指针形参交换两个整数的值。在代码中调用该函数并输出交换后的结果,以此验证函数的正确性。

C Primer&#xff08;第5版&#xff09; 练习 6.10 练习 6.10 编写一个函数&#xff0c;使用指针形参交换两个整数的值。在代码中调用该函数并输出交换后的结果&#xff0c;以此验证函数的正确性。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&…

酒店押金预授权怎么开通?微信酒店押金+房态+门锁关联 +电子押金单 解决方案

一、酒店押金管理有哪些&#xff1f; 1.渠道有银行预授权 2.微信押金支付 3.酒店押金系统 4.支付押金管理 二、银行预授权模式 酒店押金预授权通常是在客人办理入住时进行的&#xff0c;酒店会要求客人提供信用卡或借记卡的卡号、有效期、持卡人姓名等信息&#xff0c;然后…

第3讲 小程序TabBar搭建

tabBar&#xff0c;底部三个tab&#xff0c;对应三个页面&#xff0c;创建投票&#xff0c;关于锋哥&#xff0c;我的。 新建三个页面 pages.json 页面定义 "pages": [ //pages数组中第一项表示应用启动页&#xff0c;参考&#xff1a;https://uniapp.dcloud.io/col…

什么是涌现行为?

涌现行为指的是在个体间的相互作用过程中&#xff0c;由于个体间的简单规则和行为产生的复杂且不可预测的现象。这种现象通常出现在群体中&#xff0c;而不是单独的个体中。涌现行为具有一定的自发性和不可预测性&#xff0c;因为它是由许多个体的简单行为相互作用而产生的。 一…

蓝桥杯嵌入式第11届真题(完成) STM32G431

蓝桥杯嵌入式第11届真题(完成) STM32G431 题目 代码 程序和之前的大同小异&#xff0c;不过多解释 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief :…

C++重新入门-基本输入输出

C 的 I/O 发生在流中&#xff0c;流是字节序列。如果字节流是从设备&#xff08;如键盘、磁盘驱动器、网络连接等&#xff09;流向内存&#xff0c;这叫做输入操作。如果字节流是从内存流向设备&#xff08;如显示屏、打印机、磁盘驱动器、网络连接等&#xff09;&#xff0c;这…

如何计算非线性相关系数

Python中没有提供计算两组变量非线性相关系数的包或接口。x和x^2的皮尔森相关系数可能接近于0&#xff0c;因为求的是线性相关性。但是这两个变量并不是独立不相关的。使用距离相关系数就可以计算x和x^2的非线性关系&#xff0c;如果距离相关系数接近于0&#xff0c;就可以说两…

AtCoder Beginner Contest 340 C - Divide and Divide【打表推公式】

原题链接&#xff1a;https://atcoder.jp/contests/abc340/tasks/abc340_c Time Limit: 2 sec / Memory Limit: 1024 MB Score: 300 points 问题陈述 黑板上写着一个整数 N。 高桥将重复下面的一系列操作&#xff0c;直到所有不小于2的整数都从黑板上移除&#xff1a; 选择…

二、DataX安装

DataX安装 一、简介二、系统要求三、部署 一、简介 官方地址&#xff1a;https://github.com/alibaba/DataX/blob/master/userGuid.md 二、系统要求 LinuxJDK(1.8以上&#xff0c;推荐1.8) Centos7.9的java1.8安装命令&#xff1a;yum install java-1.8.0-openjdk.x86_64 Py…

Git分支和迭代流程

Git分支 feature分支&#xff1a;功能分支 dev分支&#xff1a;开发分支 test分支&#xff1a;测试分支 master分支&#xff1a;生产环境分支 hotfix分支&#xff1a;bug修复分支。从master拉取&#xff0c;修复并测试完成merge回master和dev。 某些团队可能还会有 reale…

2024/2/13

数组练习 1、选择题 1.1、若有定义语句&#xff1a;int a[3][6]; &#xff0c;按在内存中的存放顺序&#xff0c;a 数组的第10个元素是 D A&#xff09;a[0][4] B) a[1][3] C)a[0][3] D)a[1][4] 1.2、有数组 int a[5] {10&#xff0c;20&#xff0c;30&#xff0c;40&…

孙悟空吃蟠桃 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 孙悟空爱吃蟠桃&#xff0c;有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有 N 棵蟠桃树&#xff0c;每棵树上都桃子&#xff0c;守卫将在 H 小时后回来。 孙悟空…

华为数通方向HCIP-DataCom H12-821题库(单选题:441-460)

第441题 下面是一台路由输出的信息,关于这段信息描述正确的是 <R1>display bgp peerBGP local router ID : 2.2.2.2Local AS number : 100Total number of peers : 2 Peers in established state : 0Peer V AS MsgRcvd MsgSent OutQ Up/Down …

Mysql基本函数

系统函数 version()--mysql版本 user()--数据库用户名 database()--数据库名 datadir--数据库路径 version_compile_os--操作系统版本 hostname--当前机器的机器名 Schema()——当前数据库 字符串连接函数 concat(str1,str2,…)--没有分隔符地连接字符串 concat_ws(separator…

Java:什么是向上转型与向下转型(详细图解)

目录 一、什么是向上转型 1、概念 2、代码示例 3、向上转型的优缺点 二、什么是向下转型 1、向下转型的概念 ​编辑 2、代码示例 三、向下转型的缺点及 instanceof 的使用 1、向下转型的缺点 2、instanceof的使用 一、什么是向上转型 1、概念 向上转型就是创建一个…

Java并发基础:PriorityBlockingQueue全面解析!

内容概要 PriorityBlockingQueue类能高效处理优先级任务&#xff0c;确保高优先级任务优先执行&#xff0c;它内部基于优先级堆实现&#xff0c;保证了元素的有序性&#xff0c;同时&#xff0c;作为BlockingQueue接口的实现&#xff0c;它提供了线程安全的队列操作&#xff0…

人类知识的分类

根据休谟的理论&#xff0c;人类知识可以分为两个范畴&#xff1a;先验范畴和经验范畴。 先验范畴指的是那些不依赖于经验或感官观察而能够获得的知识。这些知识是基于我们的理性和思维能力而得出的&#xff0c;它们不需要通过直接观察或实验来验证。休谟认为&#xff0c;先验范…

C/C++内存管理:new、delete功能及原理实现

目录 一、C/C内存分布 二、C中内存管理方式 2.1new/delete操作内置类型 2.2 new和delete操作自定义类型 三、operator new与operator delete函数 四、new和delete的实现原理 4.1内置类型 4.2自定义类型 五、定位new 一、C/C内存分布 int globalVar 1; static int sta…

阅读 - 搭建博客

搭建博客的几种方式 1. 使用在线的博客系统&#xff0c;如语雀、掘金、CSDN等。 优点&#xff1a;直接创建账号使用即可&#xff0c;简单方便&#xff0c;不需要维护 缺点&#xff1a;文章分散在各个平台&#xff0c;不易于管理 2. github pages hugo、hexo等静态博客系统…

springboot/ssm学生信息管理系统Java学生在线选课考试管理系统

springboot/ssm学生信息管理系统Java学生在线选课考试管理系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.…