Ajax学习笔记
最近在学php,刚刚入门,用到很多与Ajax相关的交互。Ajax也用了挺久的了,想写一下学习笔记来记录一下。今天先简单写一下原理和过程。欢迎大家一起探讨。
什么是AJAX
AJAX的全称是Asynchronous JavaScript and XML。
它是一种基于JavaScript的网页应用技术。传统的提交方式会重载整个网页,而利用AJAX技术可以使JavaScript与Web服务器异步传输数据,从而实现不重载整个页面的情况下,更新局部页面局部内容。
Ajax实现过程
0. XMLHttpRequest是AJAX的基础,XMLHTTPRequest()是核心对象,首先要实例化一个XMLHTTPRequest()对象
var xhr = new XMLHTTPRequest();
1. AJAX进行请求,规定请求的类型、URL 以及是否异步处理请求。
xhr.open(method, url, async);
open()方法接收三个参数:
- method:请求的类型;GET 或 POST
- url:文件在服务器上的位置
- async:true(异步)或 false(同步)
AJAX的原理就是Asynchronous异步的,所以第三个参数async为true。
第一个参数method决定了请求类型,即传输数据的方式。
- GET
- 与POST相比,GET 更简单也更快。但是传输数据时会将数据放在地址栏的后面,对客户端而言不安全。除此之外,GET传输数据的大小受限,一般只有2k-8k,因浏览器而异。所以在传输不敏感信息并且传输文件小的情况下,我们可以选择用GET方式传输。
- POST
- POST传输是传输数据体,是隐式的,相对客户端较为安全。但是从另一层面上来说,相对服务器端就有一定的风险了。POST传输数据没有大小限制,但是服务器对上传的数据有限制,需要手动修改。
2. AJAX向服务器发送请求
xhr.send(string); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
用GET方法传输时,send(null),用POST方法传输时,需要用setRequestHeader方法设置请求头。
3. AJAX响应服务器状态
AJAX响应服务器状态涉及XMLHttpRequest对象的三个重要的属性:onreadystatechange、readyState、status。
readyState存有XMLHttpRequest的状态。从0到4发生变化:
- 0: 请求未初始化
- 1: 服务器连接已建立
- 2: 请求已接收
- 3: 请求处理中
- 4: 请求已完成,且响应已就绪
每当readyState改变时,就会触发onreadystatechange事件,在事件中判断请求是否成功,响应是否就绪,当readyState等于4且状态为200时,表示响应已就绪:
xhr.onreadystatechange = function () { if (xhr.readyState === 4) { if (xhr.status === 200) { obj.success(xhr.responseText); } } }
4. 使用 Callback 函数
obj.success(xhr.responseText);
AJAX响应就绪后,对接收到的数据进行后续的操作。
Ajax原生封装
var ajax = { create: function () { var xhr; if (XMLHttpRequest) { xhr = new XMLHttpRequest(); } else{ xhr = new ActiveXObject('Microsoft.XMLHTTP'); } return xhr; }, request: function (obj) { var xhr = this.create(); var data = this.changeData(obj.data); if (obj.type === 'GET') { xhr.open(obj.type, obj.url+'?rand='+Math.random()+'&'+data, true); xhr.send(null); } else if (obj.type === 'POST') { xhr.open(obj.type, obj.url, true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') xhr.send(data); } xhr.onreadystatechange = function () { if (xhr.readyState === 4) { if (xhr.status === 200) { obj.success(xhr.responseText); } } } }, changeData: function (data) { var arr = []; for (var i in data) { arr.push(i+'='+data[i]); } return arr.join('&'); } } // 调用 ajax.request({ type: 'POST', url: 'weibo.php', data: 'act=update', success: function(res){ console.log(res); } });
可以看出调用的形式与jQuery的实现原理相似。
相关推荐
kentrl 2020-11-10
结束数据方法的参数,该如何定义?-- 集合为自定义实体类中的结合属性,有几个实体类,改变下标就行了。<input id="add" type="button" value="新增visitor&quo
ajaxyan 2020-11-09
zndy0 2020-11-03
学留痕 2020-09-20
Richardxx 2020-11-09
learningever 2020-09-19
chongxiaocheng 2020-08-16
ajaxhe 2020-08-16
lyqdanang 2020-08-16
curiousL 2020-08-03
TONIYH 2020-07-22
时光如瑾雨微凉 2020-07-19
83510998 2020-07-18
坚持着执着 2020-07-16
jiaguoquan00 2020-07-07
李永毅 2020-07-05
坚持着执着 2020-07-05