第 33 章 Ajax

第 33 章 Ajax

1.XMLHttpRequest

2.GET 与 POST

3.封装 Ajax

2005 年 Jesse James Garrett 发表了一篇文章,标题为:“Ajax:A new Approach to Web Applications”。他在这篇文章里介绍了一种技术,用他的话说,就叫:Ajax,是 Asynchronous JavaScript + XML 的简写。这种技术能够想服务器请求额外的数据而无须卸载页面(即刷新),
会带来更好的用户体验。一时间,席卷全球。

一.XMLHttpRequest

Ajax 技术核心是 XMLHttpRequest 对象(简称 XHR),这是由微软首先引入的一个特性,其他浏览器提供商后来都提供了相同的实现。在 XHR 出现之前,Ajax 式的通信必须借助一些 hack 手段来实现,大多数是使用隐藏的框架或内嵌框架。
XHR 的出现,提供了向服务器发送请求和解析服务器响应提供了流畅的接口。能够以异步方式从服务器获取更多的信息,这就意味着,用户只要触发某一事件,在不刷新网页的情况下,更新服务器最新的数据。

虽然 Ajax 中的 x 代表的是 XML,但 Ajax 通信和数据格式无关,也就是说这种技术不一定使用 XML。

IE7+、Firefox、Opera、Chrome 和 Safari 都支持原生的 XHR 对象,在这些浏览器中创建 XHR 对象可以直接实例化 XMLHttpRequest 即可。

var xhr = new XMLHttpRequest();

alert(xhr);	//XMLHttpRequest

如果是 IE6 及以下,那么我们必须还需要使用 ActiveX 对象通过 MSXML 库来实现。在低版本 IE 浏览器可能会遇到三种不同版本的 XHR 对象,即 MSXML2.XMLHttp、MSXML2.XMLHttp.3.0、MSXML2.XMLHttp.6.0。我们可以编写一个函数。

function createXHR() {

if (typeof XMLHttpRequest != 'undefined') { return new XMLHttpRequest();
} else if (typeof ActiveXObject != 'undefined') { var versions = [
'MSXML2.XMLHttp.6.0',

'MSXML2.XMLHttp.3.0',


'MSXML2.XMLHttp'

];

for (var i = 0; i < versions.length; i ++) { try {
return new ActiveXObject(version[i]); } catch (e) {
//跳过

}

}

} else { throw new Error('您的浏览器不支持 XHR 对象!');
}

}

var xhr = new createXHR();

在使用 XHR 对象时,先必须调用 open()方法,它接受三个参数:要发送的请求类型(get、post)、请求的 URL 和表示是否异步。

xhr.open('get', 'demo.php', false);	//对于 demo.php 的 get 请求,false 同步

PS:demo.php 的代码如下:

<?php echo Date('Y-m-d H:i:s')?>	//一个时间

open()方法并不会真正发送请求,而只是启动一个请求以备发送。通过 send()方法进行发送请求,send()方法接受一个参数,作为请求主体发送的数据。如果不需要则,必须填 null。执行 send()方法之后,请求就会发送到服务器上。
xhr.send(null); //发送请求

当请求发送到服务器端,收到响应后,响应的数据会自动填充 XHR 对象的属性。那么一共有四个属性:

属性名 说明

responseText	作为响应主体被返回的文本
	
responseXML	如果响应主体内容类型是"text/xml"或"application/xml",
	则返回包含响应数据的 XML DOM 文档
	
status	响应的 HTTP 状态
	
statusText	HTTP 状态的说明

接受响应之后,第一步检查 status 属性,以确定响应已经成功返回。一般而已 HTTP 状态代码为 200 作为成功的标志。除了成功的状态代码,还有一些别的:

HTTP 状态码	状态字符串	说明
		
200	OK	服务器成功返回了页面
		
400	Bad Request	语法错误导致服务器不识别
		
401	Unauthorized	请求需要用户认证
		
404	Not found	指定的 URL 在服务器上找不到
		
500	Internal Server Error	服务器遇到意外错误,无法完成请求
		
503	ServiceUnavailable	由于服务器过载或维护导致无法完成请求

我们判断 HTTP 状态值即可,不建议使用 HTTP 状态说明,因为在跨浏览器的时候,可能会不太一致。

addEvent(document, 'click', function () {

var xhr = new createXHR();

xhr.open('get', 'demo.php?rand=' + Math.random(), false); //设置了同步 xhr.send(null);

if (xhr.status == 200) {	//如果返回成功了

alert(xhr.responseText);	//调出服务器返回的数据

} else {

alert('数据返回失败!状态代码:' + xhr.status + '状态信息:' + xhr.statusText);

}

});

以上的代码每次点击页面的时候,返回的时间都是时时的,不同的,说明都是通过服务器及时加载回的数据。那么我们也可以测试一下在非 Ajax 情况下的情况,创建一个 demo2.php 文件,使用非 Ajax。

<script type="text/javascript" src="base.js"></script> <script type="text/javascript">

addEvent(document, 'click', function () { alert("<?php echo Date('Y-m-d H:i:s')?>");

});

</script>

同步调用固然简单,但使用异步调用才是我们真正常用的手段。使用异步调用的时候,需要触发 readystatechange 事件,然后检测 readyState 属性即可。这个属性有五个值:
值 状态 说明

0 未初始化 尚未调用 open()方法

1 启动 已经调用 open()方法,但尚未调用 send()方法

2 发送 已经调用 send()方法,但尚未接受响应

3 接受 已经接受到部分响应数据

4 完成 已经接受到全部响应数据,而且可以使用

addEvent(document, 'click', function () { var xhr = new createXHR(); xhr.onreadystatechange = function () {

if (xhr.readyState == 4) { if (xhr.status == 200) {
alert(xhr.responseText); } else {

alert('数据返回失败!状态代码:' + xhr.status + '状态信息:'

+ xhr.statusText);

}

}

};

xhr.open('get', 'demo.php?rand=' + Math.random(), true); xhr.send(null);
});

PS:使用 abort()方法可以取消异步请求,放在 send()方法之前会报错。放在 responseText

之前会得到一个空值。

二.GET 与 POST

在提供服务器请求的过程中,有两种方式,分别是:GET 和 POST。在 Ajax 使用的过程中,GET 的使用频率要比 POST 高。
在了解这两种请求方式前,我们先了解一下 HTTP 头部信息,包含服务器返回的响应头信息和客户端发送出去的请求头信息。我们可以获取响应头信息或者设置请求头信息。我们可以在 Firefox 浏览器的 firebug 查看这些信息。

//使用 getResponseHeader()获取单个响应头信息

alert(xhr.getResponseHeader('Content-Type'));

//使用 getAllResponseHeaders()获取整个响应头信息

alert(xhr.getAllResponseHeaders());

//使用 setRequestHeader()设置单个请求头信息 xhr.setRequestHeader('MyHeader', 'Lee'); //放在 open 方法之后,send 方法之前

PS:我们只可以获取服务器返回回来响应头信息,无法获取向服务器提交的请求头信息,自然自定义的请求头,在 JavaScript 端是无法获取到的。

GET 请求

GET 请求是最常见的请求类型,最常用于向服务器查询某些信息。必要时,可以将查询字符串参数追加到 URL 的末尾,以便提交给服务器。

xhr.open('get', 'demo.php?rand=' + Math.random() + '&name=Koo', true);

通过 URL 后的问号给服务器传递键值对数据,服务器接收到返回响应数据。特殊字符

传参产生的问题可以使用 encodeURIComponent()进行编码处理,中文字符的返回及传参,可以讲页面保存和设置为 utf-8 格式即可。

//一个通用的 URL 提交函数 function addURLParam(url, name, value) {

url += (url.indexOf('?') == -1 ? '?' : '&'); //判断的 url 是否有已有参数 url += encodeURIComponent(name) + '=' + encodeURIComponent(value); alert(url);

return url;

}

PS:当没有 encodeURIComponent()方法时,在一些特殊字符比如“&”,会出现错误导致无法获取。

POST 请求

POST 请求可以包含非常多的数据,我们在使用表单提交的时候,很多就是使用的 POST 传输方式。

xhr.open('post', 'demo.php', true);

而发送 POST 请求的数据,不会跟在 URL 的尾巴上,而是通过 send()方法向服务器提交数据。

xhr.send('name=Lee&age=100');

一般来说,向服务器发送 POST 请求由于解析机制的原因,需要进行特别的处理。因为 POST 请求和 Web 表单提交是不同的,需要使用 XHR 来模仿表单提交。
xhr.setRequestHeader(‘Content-Type’, ‘application/x-www-form-urlencoded’);

PS:从性能上来讲 POST 请求比 GET 请求消耗更多一些,用相同数据比较,GET 最多比 POST 快两倍。

上一节课的 JSON 也可以使用 Ajax 来回调访问。

var url = 'demo.json?rand=' + Math.random();

var box = JSON.parse(xhr.responseText);

三.封装 Ajax

因为 Ajax 使用起来比较麻烦,主要就是参数问题,比如到底使用 GET 还是 POST;到底是使用同步还是异步等等,我们需要封装一个 Ajax 函数,来方便我们调用。

function ajax(obj) {

var xhr = new createXHR();

obj.url = obj.url + '?rand=' + Math.random(); obj.data = params(obj.data);
if (obj.method === 'get') obj.url = obj.url.indexOf('?') == -1 ?

obj.url + '?' + obj.data : obj.url + '&' + obj.data;

if (obj.async === true) { xhr.onreadystatechange = function () {


if (xhr.readyState == 4) callback();

};

}

xhr.open(obj.method, obj.url, obj.async); if (obj.method === 'post') {
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send(obj.data);
} else { xhr.send(null);

}

if (obj.async === false) { callback();
}

function callback () {

if (xhr.status == 200) {

obj.success(xhr.responseText);	//回调

} else { alert('数据返回失败!状态代码:' + xhr.status + ',
状态信息:' + xhr.statusText);

}

}

}
//调用 ajax

addEvent(document, 'click', function () { //IE6 需要重写 addEvent ajax({

method : 'get',

url : 'demo.php',

data : {

'name' : 'Lee',

'age' : 100

},

success : function (text) { alert(text);
},

async : true

});

});

//名值对编码 function params(data) {

var arr = [];

for (var i in data) {

arr.push(encodeURIComponent(i) + '=' + encodeURIComponent(data[i]));


}

return arr.join('&');

}

PS:封装 Ajax 并不是一开始就形成以上的形态,需要经过多次变化而成。

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

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

相关文章

数据结构-5.1.树的定义和基本术语

一.树的基本概念&#xff1a; 1.根结点&#xff1a;最顶层的结点&#xff0c;有且仅有一个&#xff0c;没有前驱&#xff1b; 2.叶子结点&#xff1a;不能再有子结点&#xff0c;没有后继&#xff1b; 3.结点&#xff1a;用于存数据&#xff1b; 4.也有前驱和后继的说法&…

制造企业MES管理系统的应用策略与实施路径

在智能制造浪潮的席卷之下&#xff0c;MES管理系统作为连接生产计划与车间操作的核心桥梁&#xff0c;其战略地位愈发显著。本文旨在深入剖析MES管理系统在智能制造转型中的核心价值、实施策略及实践路径&#xff0c;为制造企业探索智能化生产之路提供实践指导与灵感启发。 MES…

JavaScript函数基础(通俗易懂篇)

10.函数 10.1 函数的基础知识 为什么会有函数&#xff1f; 在写代码的时候&#xff0c;有一些常用的代码需要书写很多次&#xff0c;如果直接复制粘贴的话&#xff0c;会造成大量的代码冗余&#xff1b; 函数可以封装一段重复的javascript代码&#xff0c;它只需要声明一次&a…

github 搭建个人导航网

最近搭建了个 个人的导航网&#xff0c;具体内容见下图&#xff0c;欢迎大家访问吖&#xff0c;点击访问 具体实现是使用 vue3 编写&#xff0c;白嫖 github 的 page 部署 首先在 github上创建一个仓库&#xff1a;name.github.io # name是你 github 的名字 然后在本地创建一…

◇【论文_20181020 v6】广义优势估计器 (generalized advantage estimator, GAE)

https://arxiv.org/abs/1506.02438 ICLR 2016 加州伯克利 电子工程与计算机科学系 High-Dimensional Continuous Control Using Generalized Advantage Estimation 文章目录 摘要1 引言2 预备知识3 优势函数估计4 解释为 奖励设计reward shaping5 价值函数估计6 实验6.1 策略优…

九、Drf序列化器

九、序列化器 9.1序列化 从数据库取QuerySet或数据对象转换成JSON 9.1.1序列化器的简易使用 #新建一张部门表 class Depart(models.Model):titlemodels.CharField(verbose_name部门,max_length32)ordermodels.IntegerField(verbose_name顺序)countmodels.IntegerField(verb…

C语言_内存函数

内存函数是 C 标准库中的一组函数&#xff0c;用于管理和操作内存。使用时需要包含头文件<string.h>。 1. memcpy的使用和模拟实现 函数形式如下&#xff1a; void* memcpy(void* destination, const void* source, size_tnum);函数解析和注意事项&#xff1a; memcp…

LinuxO(1)调度算法

概念 在Linux中&#xff0c;O(1)调度算法是一种进程调度算法。O(1)表示算法的时间复杂度是常数级别的&#xff0c;与系统中的进程数量无关。 运行队列结构 他采用了两个运行队列&#xff0c;一个活动队列和一个过期队列。活动队列中的进程是有资格获取CPU时间片的进程&#x…

AWS EC2 部署Echarts大屏展示项目

前言 Echarts简介 ECharts是一个由JavaScript开发的开源可视化库。它能使数据生动、直观、互动、高度个性化数据可视化图表。ECharts适用大部分浏览器&#xff0c;如IE6 、Chrome、Firefox、Safari等&#xff0c;同时支持PC和移动设备。 开源&#xff1a;ECharts是一个开源项目…

【JavaEE】——文件IO

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;认识文件 1&#xff1a;文件的概念 2&#xff1a;文件的结构 3&#xff1a;文件路径…

矩阵求解复数(aniwoth求解串扰)

所以这种求解串扰的格式是因为&#xff0c;有串扰的共轭项在方程组中 复数共轭项的作用&#xff0c;但是这是二次方程&#xff0c;

【深度学习】yolov8n模型的剪枝操作记录

原始 剪枝微调后 可以看到模型大小了&#xff0c; 测试结果显示再cpu 上加速5%-10% from ultralytics import YOLOimport time # Load a pretrained YOLO11n model count_num 500 def test1():model YOLO("/home/justin/Desktop/code/v8_prun/runs/detect/train3/weig…

算法知识点————贪心

贪心&#xff1a;只考虑局部最优解&#xff0c;不考虑全部最优解。有时候得不到最优解。 DP&#xff1a;考虑全局最优解。DP的特点&#xff1a;无后效性&#xff08;正在求解的时候不关心前面的解是怎么求的&#xff09;&#xff1b; 二者都是在求最优解的&#xff0c;都有最优…

微服务实战——ElasticSearch(保存)

商品上架——ElasticSearch&#xff08;保存&#xff09; 0.商城架构图 1.商品Mapping 分析&#xff1a;商品上架在 es 中是存 sku 还是 spu &#xff1f; 检索的时候输入名字&#xff0c;是需要按照 sku 的 title 进行全文检索的检索使用商品规格&#xff0c;规格是 spu 的…

No package nodejs available.No package npm available.

安装nodejs时出现的报错 这个错误的原因是当前的 yum 源没有包含 Node.js 和 npm 的安装包。 解决方法 使用 NodeSource 仓库 curl -fsSL https://rpm.nodesource.com/setup_14.x | bash -运行 yum install 安装 Node.js 和 npm&#xff1a; yum install -y nodejs使用 E…

深入了解Oracle OCP认证,开启数据库专业之旅

使用Oracle数据库的公司内部&#xff0c;经常有员工们在讨论OCP认证(Oracle Certified Professional&#xff0c;Oracle认证专家)&#xff0c;这是甲骨文Oracle公司提供的一种专业认证&#xff0c;认证用于使用者在Oracle技术领域的专业知识和技能。 在这里&#xff0c;有一点…

华为、华三、锐捷网络设备的常用命令整理

华为&#xff08;Huawei&#xff09;、华三&#xff08;H3C&#xff09;、锐捷&#xff08;Ruijie&#xff09;常用网络设备命令&#xff1a; 华为&#xff08;Huawei&#xff09; 查看设备的信息&#xff0c;可执行“display version”命令。 查看当下的配置&#xff0c;则…

动手学深度学习9.3. 深度循环神经网络-笔记练习(PyTorch)

本节课程地址&#xff1a;58 深层循环神经网络【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&#xff1a;9.3. 深度循环神经网络 — 动手学深度学习 2.0.0 documentation (d2l.ai) 本节开源代码&#xff1a;...>d2l-zh>pytorch>chapter_multilayer-perceptr…

计算机毕业设计Tensorflow交通标志识别检测 车流量预测 车速检测 自动驾驶 机器学习 深度学习 人工智能 PyTorch 大数据毕设

《Tensorflow交通标志识别检测》开题报告 一、研究背景及意义 随着智能交通系统和无人驾驶技术的快速发展&#xff0c;交通标志识别系统成为智能驾驶系统的重要组成部分。传统的交通标志识别方法主要依赖于人工检查和识别&#xff0c;存在效率低下、易受主观因素影响等问题。…

聚观早报 | 苹果重磅更新;OpenAI推出ChatGPT Canvas

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 10月1日消息 苹果重磅更新 OpenAI推出ChatGPT Canvas Meta发布Movie Gen iQOO 13影像规格曝光 华为HarmonyOS N…