前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >这次,我们聊聊ajax的创建过程

这次,我们聊聊ajax的创建过程

原创
作者头像
前端林子
发布于 2018-08-22 15:06:42
发布于 2018-08-22 15:06:42
4.2K20
代码可运行
举报
文章被收录于专栏:前端技术总结前端技术总结
运行总次数:0
代码可运行

身为一枚前端,在项目中和后台的交互简直太频繁了。项目中,一直在使用的是jQuery中封装好了的$.ajax()的方法,这个方法大家一定非常熟悉了,具体使用的格式参数等这里不再赘述,今天要详细说的是ajax的创建过程。

ajax:一种客户端向服务器请求数据的方式,不需要去刷新整个页面; ajax的核心:XMLHttpRequest对象

下面是我简单封装的一个函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script>
	ajax({
		url:'',    //请求地址
		type:"POST",     //请求方式
		data:{name:'linda',age:24},      //请求参数
		dataType:'json',
		success:function(reponse,xml){
			//此处放成功后执行的代码
		},
		fail:function(status){
			//此处放失败后执行的代码
		}
	});

	function ajax(options){
		//第一步,创建一个XHR对象,也即一个异步调用的对象
		function createXHR(){
			var xhr;
			//非IE6
			if(typeof XMLHttpRequest != 'undefined'){
				xhr = new XMLHttpRequest();
			}
			//IE6及以下版本浏览器
			else if(typeof ActiveXObject != 'undefined'){
				xhr = new ActiveXObject("Microsoft.XMLHTTP");
			}
			else{
				xhr = null;
			}
			return xhr;
		}

		var xhr = createXHR();

		//第三步,设置相应HTTP请求的状态变化函数
		xhr.onreadystatechange = function(){
			if(xhr.readyState == 4){
				if(xhr.status>=200 && xhr.status<=300 || xhr.status == 304){
					options.success(xhr.responseText,responseXML);
				}
				else{
					options.fail(xhr.status);
				}
			}
		}

		//第二步,创建一个新的HTTP请求,并设置请求的方式、URL,是否异步。
		//第四步,发送HTTP请求
		if(options.type == 'GET'){
			xhr.open('GET',addURIParams(options.url,options.params),true);
			xhr.send(null);
		}
		else if(options.type == 'POST'){
			xhr.open('POST',url,true);
			xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
			xhr.send(options.params);
		}

		function addURIParams(url,data){
			for(var name in data){
				url += (url.indexOf('?') == -1 ? "?" : "&");
				url += encodeURIComponent(name)+ '=' + encodeURIComponent(data[name]);
			}
			return url;
		}
	}
</script>

1.创建

1.1、IE7及其以上版本中支持原生的 XHR 对象,因此可以直接用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 var oAjax = new XMLHttpRequest();

1.2、IE6及其之前的版本中,XHR对象是通过MSXML库中的一个ActiveX对象实现的。有的书中细化了IE中此类对象的三种不同版本,即MSXML2.XMLHttp、MSXML2.XMLHttp.3.0 和 MSXML2.XMLHttp.6.0;个人感觉太麻烦,可以直接使用下面的语句创建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 var oAjax=new ActiveXObject(’Microsoft.XMLHTTP);

2.连接和发送

2.1、open()函数的三个参数:请求方式、请求地址、是否异步请求(同步请求的情况极少,至今还没用到过);

2.2、GET 请求方式是通过URL参数将数据提交到服务器的,POST则是通过将数据作为 send 的参数提交到服务器;

2.3、POST 请求中,在发送数据之前,要设置表单提交的内容类型;具体来说是这样的:默认情况下,服务器对POST请求和提交WEB表单的请求并不会一视同仁。因此,服务器必须有程序来读取发送过来的原始数据,并从中解析出有用的部分。不过,我们可以使用XHR来模仿WEB表单提交。首先将Content-Type头部信息设置成:application/x-www-form-urlencoded,也就是表单提交时的内容类型,其次是以适当的格式创建一个字符串,发送HTTP请求。

2.4、提交到服务器的参数必须经过 encodeURIComponent() 方法进行编码,实际上在参数列表”key=value”的形式中,key 和 value 都需要进行编码,因为会包含特殊字符。

encodeURI() :用于整个 URI 的编码,不会对本身属于 URI 的特殊字符进行编码,如冒号、正斜杠、问号和井号;其对应的解码函数 decodeURI(); encodeURIComponent() :用于对 URI 中的某一部分进行编码,会对它发现的任何非标准字符进行编码;其对应的解码函数 decodeURIComponent();

3.接收

3.1、接收到响应后,响应的数据会自动填充XHR对象,相关属性如下 responseText:响应返回的主体内容,为字符串类型; responseXML:如果响应的内容类型是 “text/xml” 或 “application/xml”,这个属性中将保存着相应的xml 数据,是 XML 对应的 document 类型; status:响应的HTTP状态码; statusText:HTTP状态的说明;

3.2、XHR对象的readyState属性表示请求/响应过程的当前活动阶段,这个属性的值如下 0-未初始化,尚未调用open()方法; 1-启动,调用了open()方法,未调用send()方法; 2-发送,已经调用了send()方法,未接收到响应; 3-接收,已经接收到部分响应数据; 4-完成,已经接收到全部响应数据;

只要 readyState 的值变化,就会调用 readystatechange 事件,(其实为了逻辑上通顺,可以把readystatechange放到send之后,因为send时请求服务器,会进行网络通信,需要时间,在send之后指定readystatechange事件处理程序也是可以的,但为了规范和跨浏览器兼容性,还是在open之前进行指定吧)。

3.3、在readystatechange事件中,先判断响应是否接收完成,然后判断服务器是否成功处理请求,xhr.status 是状态码,状态码以2开头的都是成功,304表示从缓存中获取。

4.ajax请求是不能跨域的!

上述是我参考了《javascript高级程序设计》以及网上多方资料总结出来的,如果有错误,欢迎大家指正~~~

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
2 条评论
热度
最新
补充一下:如果使用post方式请求,则需要对传过去的data进行格式化为key=value这样的键值对字符串,直接传对象应该是不可以的
补充一下:如果使用post方式请求,则需要对传过去的data进行格式化为key=value这样的键值对字符串,直接传对象应该是不可以的
回复回复点赞举报
1.进行post请求时代码应该是xhr.open('POST',options.url,true)而不是xhr.open('POST',url,true)。2.在调用ajax函数时穿过去的数据字段为data,使用时却是params。3.在调用success函数时传参应为xhr.responseText,xhr.responseXML而不是xhr.responseText,responseXML。都是些小问题
1.进行post请求时代码应该是xhr.open('POST',options.url,true)而不是xhr.open('POST',url,true)。2.在调用ajax函数时穿过去的数据字段为data,使用时却是params。3.在调用success函数时传参应为xhr.responseText,xhr.responseXML而不是xhr.responseText,responseXML。都是些小问题
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
HTML5-类库系列 补讲AJAX
HTML5学堂:AJAX主要是两个兼容问题,其一是AJAX请求的创建,其二是加载状态的检测。本文主要讲解AJAX兼容的方法的搭建。 AJAX请求的创建 大部分使用AJAX的人都会使用new XMLHttpRequest()的方法进行AJAX的创建。这种方法能够很好的兼容IE7以及IE7+的浏览器,但是却没有办法处理IE7-的低版本浏览器。对于当前,我们已经摆脱了IE6的困扰,所以这个兼容问题也不再是那么严重,在这里仅仅做一个介绍。 IE5是第一款引入AJAX的浏览器,在IE5中,需要通过ActiveX对象实
HTML5学堂
2018/03/12
8810
ajax的jquery写法和原生写法
Ajax被认为是(Asynchronous(异步) JavaScript And Xml的缩写)。现在,允许浏览器与服务器通信而无须刷新当前页面的技术都被叫做Ajax.
三哥
2018/12/28
1.9K0
Ajax 的用法
1、什么是 Ajax?   Ajax,英文名 Asynchronous JavaScript and XML,也就是异步的 JavaScript 和 XML。它不是一门新的语言,而是一种使用现有标准的
IT可乐
2017/12/27
1.3K0
Ajax 的用法
前后端数据交互(二)——原生 ajax 请求详解
通过后台与服务器进行少量数据交换,ajax可以使网页实现异步更新。也就是在不需要重新加载整个网页的情况下,能够更新部分网页的技术。传统的网页不使用ajax,如果需要更新内容,必须重新加载整个页面。
呆呆
2021/09/30
1.8K0
JavaScript之Ajax异步
同步调用相对简单,但使用异步调用才是我们真正常用的手段。使用异步调用的时候,需要触发readystatechange事件,然后检测readyState属性即可。这个属性有五个值:
IT工作者
2022/01/15
1.2K0
【javascript】ajax 基础
http://www.cnblogs.com/yjzhu/archive/2013/01/28/2879542.html
bear_fish
2018/09/19
3570
AJAX和JSON
open方法不会向服务器发送真正请求,它相当于初始化请求并准备发送只能向同一个域中使用相同协议和端口的URL发送请求,否则会因为安全原因而报错。
乐心湖
2021/01/18
2.6K0
AJAX和JSON
Ajax学习计划
AJAX:Asynchronous Javascript And XML(异步JavaScript和XML)。是指一种创建交互式网页应用的网页开发技术。 AJAX = 异步 JavaScript和XML(标准通用标记语言的子集)。 AJAX 是一种用于创建快速动态网页的技术。 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。 传统的网页(不使用 AJAX)如果需要更新内容,必须重载整个网页页面。
Marco爱吃红烧肉
2021/07/27
5380
Ajax之路
第一部分: Ajax全称Asynchronous Javascript and XML,中文意思为“异步的Javascript 和XML”。 Ajax这组技术是web2.0的核心之一。   Ajax不是一项技术,它是多种技术组合而成: 运用XHTML和CSS实现基于各种标准的展示。 运用文档对象模型(Document Object Model,DOM)实现动态显示和交互。 运用XML和XSLT实现数据交换和操作 运用XMLHttpRequest(Ajax核心,简称XHR对象)实现异步数据检索 Jav
用户1149564
2018/01/11
1.1K0
Ajax之路
原生JS--Ajax
Ajax基础: --ajax:无刷新数据读取,读取服务器上的信息 --HTTP请求方法:     --GET:用于获取数据,如浏览帖子     --POST:用于上传数据,如用户注册
莫问今朝
2019/02/25
6.3K0
原生JS封装Ajax插件(同域&&jsonp跨域)
用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉挺可行的。。。简单说说思路,有兴趣的可以自己跟着写一个,顺便熟悉一下原生的Ajax...
winty
2019/12/23
3K0
js中ajax写法_ajax原生写法
function createXHR() { //首先我们得创建一个XMLHttpRequest对象
全栈程序员站长
2022/11/11
11.7K0
Ajax从入门到静态发展
所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject)。
用户9184480
2024/12/13
1130
JSP的原生Ajax与解析Json
Ajax=异步Javascript+XML; ajax是一种数据请求的方式,不需要刷新整个页面。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。 ajax的核心技术当然是XMLHttpRequest对象; ajax请求过程:创建XMLHttpRequest对象、连接服务器、发送请求、接受相响应数据。
全栈程序员站长
2022/08/04
1.5K0
原生JS实现一个Ajax跨域请求
Asynchronous JavaScript + XML(异步 JavaScript 和 XML), 其本身不是一种新技术,而是一个在 2005 年被 Jesse James Garrett 提出的新术语,用来描述一种使用现有技术集合的‘新’方法。
Dreamy.TZK
2020/09/01
3.3K0
一、Ajax的基本用法
指发送一个请求,需要等待返回,然后才能够发送下ー个请求。同步交互相当于排队,轮到下一个的情况会因为前一个而有所不同。
Dreamy.TZK
2020/08/24
6200
一、Ajax的基本用法
第110天:Ajax原生js封装函数
一、Ajax的实现主要分为四部分: 1、创建Ajax对象 1 // 创建ajax对象 2 var xhr = null; 3 if(window.XMLHttpRequest){ 4 xhr = new XMLHttpRequest(); 5 } else { 6 //为了兼容IE6 7 xhr = new ActiveXObject('Microsoft.XMLHTTP'); 8 } 2、连接服务器 // 连接服务器open(方法GET/POST,请求地址, 异步传输) xhr.o
半指温柔乐
2018/09/11
2.9K0
ajax和它的超时
假设页面结构分为三栏:左、中、右,而且页面数据会比较多,页面呈现的顺序则是是按从上而下执行的(当然是从左至右开始,一个模块一个模块加载数据),如果不采用队列,那么在页面可视范围之外的模块可能已经加载完数据了,而可视范围之内(假设为第一屏)的模块却尚未开始接收数据,这一类应用如:搜狐博客、新浪博客、网易博客等…
meteoric
2018/11/15
1.5K0
javascript实现Ajax
文章目录 1. javascript实现Ajax 1.1. 定义 2. 实现的步骤 2.1. 创建XMLHttpRequest 2.2. 打开 2.3. 发送请求 2.4. 接收服务器响应数据 3. 实例 javascript实现Ajax 定义 异步的javascript和XML,实现异步提交功能的技术(XMLHttpRequest) 不响应页面的前提下,服务器可以响应其中的一小部分数据到页面上 实现的步骤 创建XMLHttpRequest 解决浏览器兼容问题 function getXHR(){ v
爱撒谎的男孩
2019/12/31
6250
原生——ajax
什么是Ajax?(前后端数据交互) Asynchronous JavaScript and XML(异步JavaScript和XML)
FinGet
2019/06/28
2K0
相关推荐
HTML5-类库系列 补讲AJAX
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文