关于Ajax的原理以及代码封装详解


Posted in Javascript onSeptember 08, 2017

前言

其实AJAX内部实现并不麻烦,主要通过一个叫XMLHttpRequest的对象,而这个对象在现有的浏览器均被支持。

可以说,它是整个AJAX实现的基础,是浏览器用于后台与服务器交换数据的对象,有了它,才有了AJAX,也便有了部分页面刷新的艺术!

本文主要给大家介绍了关于Ajax原理以及代码封装的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

示例代码

var xmlhttp;
if (window.XMLHttpRequest) {
 // code for IE7+, Firefox, Chrome, Opera, Safari
 xmlhttp = new XMLHttpRequest();
} else {
 // code for IE6, IE5 
 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
 if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
  // to do...
 }
}
xmlhttp.open("GET","test1.txt",true);
xmlhttp.send();

步骤:

1、创建。

创建 XMLHttpRequest 对象的语法:

var = new XMLHttpRequest();

老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 对象:

var = new ActiveXObject("Microsoft.XMLHTTP");

2、连接和发送。

2.1、open()函数的三个参数:请求方式、请求地址、是否异步请求

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

2.3、POST 请求中,在发送数据之前,要设置表单提交的内容类型

2.3、提交到服务器的参数必须经过 encodeURIComponent() 方法进行编码,实际上在参数列表key=value的形式中,key 和 value 都需要进行编码,因为会包含特殊字符。每次请求的时候都会在参数列表中拼入一个 v=xx 的字符串,这样是为了拒绝缓存,每次都直接请求到服务器上。

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表示从缓存中获取,上面的代码在每次请求的时候都加入了随机数,所以不会从缓存中取值,故该状态不需判断。

封装ajax方法:

ajax({  
  url: "./test.php",
  type: "POST",      
  data: { name: "abc", age: 18 },   
  dataType: "json",  
  success: function (response, xml) {   
   // 执行成功回调  
  },  
  fail: function (status) {   
   // 执行失败回调  
  }
 });
  
  function ajax(options) { 
   options = options || {}; 
   options.type = (options.type || "GET").toUpperCase();  
   options.dataType = options.dataType || "json";  
   var params = formatParams(options.data);    
   
   // 创建对象  
   if (window.XMLHttpRequest) {   
    var xhr = new XMLHttpRequest(); 
   } else {   
    var xhr = new ActiveXObject('Microsoft.XMLHTTP');  
   } 
   
   //接收 - 第三步
   xhr.onreadystatechange = function () {   
    if (xhr.readyState == 4) {    
     var status = xhr.status;    
     if (status >= 200 && status < 300) {     
      options.success && options.success(xhr.responseText,xhr.responseXML);    
     } else {     
      options.fail && options.fail(status);    
     }   
    }
   }  
    
   //连接 和 发送 - 第二步 
   if (options.type == "GET") {   
    xhr.open("GET", options.url + "?" + params, true);   
    xhr.send(null);  
   } else if (options.type == "POST") {   
    xhr.open("POST", options.url, true);   
    //设置表单提交时的内容类型   
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr.send(params);  
   }  
   
   //格式化参数 
   function formatParams(data) { 
    var arr = [];  
    for (var name in data) {   
     arr.push(encodeURIComponent(name) + "=" + encodeURIComponent(data[name])); 
    }  
    arr.push(("v=" + Math.random()).replace(".",""));  
    return arr.join("&"); 
   }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Javascript 跨域访问解决方案
Feb 14 Javascript
Google AJAX 搜索 API实现代码
Nov 17 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
Aug 07 Javascript
js解决弹窗问题实现班级跳转DIV示例
Jan 06 Javascript
jQuery实现拖拽效果插件的方法
Mar 23 Javascript
JS判断字符串包含的方法
May 05 Javascript
JS组件Bootstrap实现图片轮播效果
May 16 Javascript
JS从数组中随机取出几个数组元素的方法
Aug 02 Javascript
以BootStrap Tab为例写一个前端组件
Jul 25 Javascript
webpack4 css打包压缩问题的解决
May 18 Javascript
Taro集成Redux快速上手的方法示例
Jun 21 Javascript
vue实现pdf文档在线预览功能
Nov 26 Javascript
vue父子组件的嵌套的示例代码
Sep 08 #Javascript
jQuery选择器中的特殊符号处理方法
Sep 08 #jQuery
通过button将form表单的数据提交到action层的实例
Sep 08 #Javascript
Vue 多层组件嵌套二种实现方式(测试实例)
Sep 08 #Javascript
JavaScript实现图片拖曳效果
Sep 08 #Javascript
Vue.js移动端左滑删除组件的实现代码
Sep 08 #Javascript
javascript将list转换成树状结构的实例
Sep 08 #Javascript
You might like
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
PHP人民币金额数字转中文大写的函数代码
2013/02/27 PHP
php json与xml序列化/反序列化
2013/10/28 PHP
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
用javascript做拖动布局的思路
2008/05/31 Javascript
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
Javascript selection的兼容性写法介绍
2013/12/20 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
2014/08/01 Javascript
nodejs爬虫抓取数据之编码问题
2015/07/03 NodeJs
JS+CSS实现带小三角指引的滑动门效果
2015/09/22 Javascript
给before和after伪元素设置js效果的方法
2015/12/04 Javascript
JavaScript实现瀑布流布局
2020/06/28 Javascript
学习JavaScript设计模式之享元模式
2016/01/18 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
详解用Node.js写一个简单的命令行工具
2018/03/01 Javascript
jQuery实现的滑块滑动导航效果示例
2018/06/04 jQuery
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
vue-cli4.x创建企业级项目的方法步骤
2020/06/18 Javascript
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
[07:54]DOTA2-DPC中国联赛 正赛 iG vs VG 选手采访
2021/03/11 DOTA
python提取字典key列表的方法
2015/07/11 Python
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
python将ansible配置转为json格式实例代码
2017/05/15 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
2021/01/23 Python
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
美国最大的香水出口:FragranceX.com
2017/11/04 全球购物
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
小学教师国培感言
2014/02/08 职场文书
工作过失检讨书
2014/02/23 职场文书
2015年教师节感言
2015/08/03 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书
教你怎么用Python实现GIF动图的提取及合成
2021/06/15 Python
Android基于Fresco实现圆角和圆形图片
2022/04/01 Java/Android