关于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 相关文章推荐
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
Dec 12 Javascript
Egret引擎开发指南之运行项目
Sep 03 Javascript
js窗口关闭提示信息(兼容IE和firefox)
Oct 23 Javascript
学习JavaScript设计模式(继承)
Nov 26 Javascript
jquery在ie7下选择器的问题导致append失效的解决方法
Jan 10 Javascript
js正则表达式注册页面表单验证
Oct 11 Javascript
jQuery插件echarts实现的单折线图效果示例【附demo源码下载】
Mar 04 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
Jun 01 Javascript
Vue项目中最新用到的一些实用小技巧
Nov 06 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
Dec 09 Javascript
深入浅析vue-cli@3.0 使用及配置说明
May 08 Javascript
浅谈JavaScript作用域
Dec 06 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
PHP采集利器 Snoopy 试用心得
2011/07/03 PHP
php使用fopen创建utf8编码文件的方法
2014/10/31 PHP
Yii框架表单模型和验证用法
2016/05/20 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
php 利用socket发送GET,POST请求的实例代码
2020/07/04 PHP
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
javascript中删除指定数组中指定的元素的代码
2011/02/12 Javascript
js匿名函数的调用示例(形式多种多样)
2014/08/20 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
2014/09/01 Javascript
jquery实现垂直和水平菜单导航栏
2020/08/27 Javascript
最常见和最有用的字符串相关的方法详解
2017/02/06 Javascript
JavaScript实现图片切换效果
2017/08/12 Javascript
vue商城中商品“筛选器”功能的实现代码
2020/07/01 Javascript
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
Python脚本实时处理log文件的方法
2016/11/21 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
Django组件cookie与session的具体使用
2019/06/05 Python
PyQt5 多窗口连接实例
2019/06/19 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
django使用F方法更新一个对象多个对象字段的实现
2020/03/28 Python
草莓网化妆品日本站:Strawberrynet日本
2017/10/20 全球购物
厨师长岗位职责
2014/03/02 职场文书
企业年会主持词
2014/03/27 职场文书
毕业设计说明书
2014/05/07 职场文书
拔河比赛口号
2014/06/10 职场文书
社区清明节活动总结
2014/07/04 职场文书
领导干部对照检查材料
2014/08/24 职场文书
群众路线教育党员自我剖析材料
2014/10/06 职场文书
党干部专题民主生活会对照检查材料思想汇报
2014/10/06 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书
python编写函数注意事项总结
2021/03/29 Python
python unittest单元测试的步骤分析
2021/08/02 Python
pycharm安装深度学习pytorch的d2l包失败问题解决
2022/03/25 Python
基于Python实现nc批量转tif格式
2022/08/14 Python