Jquery揭秘系列:ajax原生js实现详解(推荐)


Posted in Javascript onJune 08, 2016

讲到ajax这个东西,我们要知道两个对象XMLHTTPRequest和ActiveXObject ,提供了对 HTTP 协议的完全的访问,包括做出 POST 和 HEAD 请求以及普通的 GET 请求的能力。可以同步或异步返回 Web 服务器的响应,并且能以文本或者一个 DOM 文档形式返回内容。XMLHTTPRequest基本上算是标准化了,兼容大部分浏览器ActiveXObject这玩儿意儿是微软的东西,所以是为了兼容IE版本,我们用的只是它的xmlHTTP功能。

为了功能的明确和清晰,我们把这个ajax代码分为5个部分:

•对象的创建

•onreadystatechange句柄处理

•参数拼接

•Get功能实现

•Post功能实现

1.对象的创建 :

首先创建用作 XMLHttpRequest 对象的 XMLHttp 变量。把它的值设置为 null。

按照 web 标准创建对象 (Mozilla, Opera 以及 Safari):XMLHttp=new XMLHttpRequest()

按照微软的方式创建对象,在 Internet Explorer 6 及更高的版本可用:XMLHttp=new ActiveXObject("Msxml2.XMLHTTP")

如果捕获错误,则尝试更老的方法 (Internet Explorer 5.5) :XMLHttp=new ActiveXObject("Microsoft.XMLHTTP")

var xhrFactory = function () {
    this.init.apply(this, arguments);
   }
   xhrFactory.prototype = {
    init: function () {
     this.xhr = this.create();
    },
    create: function () {
     var xhr = null;
     try {
      if (window.XMLHttpRequest) {
       xhr = new XMLHttpRequest();
      }
      else if (window.ActiveXObject) {
       xhr = new ActiveXObject("Msxml2.Xmlhttp");
      }
     }
     catch (err) {
      xhr = new ActiveXObject("Microsoft.Xmlhttp");
     }
     return xhr;
    }
}

2.onreadystatechange句柄:

readystate: function (timeout,callback) {
     this.xhr.onreadystatechange = function () {
      if (this.readyState == 4 && this.status == 200) {
       callback(eval("(" + this.responseText + ")"));
      }
      else {
       setTimeout(function () {
        this.xhr.abort();
       }, !timeout ? 15000 : timeout);
      }
      
     }
    }

这里面要说一下readyState和status属性。

readyState:

1.创建MLHTTP对象  
2.打开与服务器的连接 
3.发送指令  
4.等待处理请求结果  。

status:

200.请求成功  
400.请求错误。。。
还有很多值 ,这里就不一个个说了。

timeout参数是请求过期时间  
callback参数,回调对返回数据做了处理,转换成对象。

3.参数拼接

para: function (data) {
     var datastr = "";
     if (data && Object.prototype.toString.call(data) == "[object Object]") {
      for (var i in data) {
       for (var i = 0; i < length; i++) {
        datastr += i + "=" + data[i] + "&";
       }
      }
     }
     return datastr;
    }

这里是将传入的对象参数拼接成字符窜,用于ajax请求时发送参数。

4.Get功能实现:

get: function (url, data, callback, async, timeout) {
     this.readystate(timeout, callback);
     var newurl = url;
     var datastr = this.para(data);
     newurl = url + "?" + datastr;
     this.xhr.open("get", newurl, !async ? true : async);
     this.xhr.send(null);
    }

get 请求,发送的参数是直接在url上拼接的,而不是在send里面发送,而post方式参数则是在send里面发送。

5.Post功能实现

post: function (url, data, callback, async, timeout) {
     this.readystate(timeout, callback);
     var newurl = url;
     var datastr = this.para(data);
     this.xhr.open("post", newurl, !async ? true : async);
     this.xhr.setRequestHeader("content-type", "x-www-form-urlencoded");
     this.xhr.send(!datastr ? null : datastr);
    }

post这里面多了一段代码:this.xhr.setRequestHeader("content-type", "x-www-form-urlencoded");

这段代码其实是说明将整个发送内容作为一个整体进行编码,get则是单个参数进行编码拼接 ,这也是post和get的区别。

调用方式如下 :

var xhr = new xhrFactory();
   xhr.post("test.ashx", null, function (data) {
    alert(data);
   });

以上这篇Jquery揭秘系列:ajax原生js实现详解(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
this[] 指的是什么内容 讨论
Mar 24 Javascript
js压缩工具 yuicompressor 使用教程
Mar 31 Javascript
js 实现打印网页中定义的部分内容的代码
Apr 01 Javascript
JavaScript中常用的运算符小结
Jan 18 Javascript
中文字符串截取的js函数代码
Apr 17 Javascript
JQuery判断HTML元素是否存在的两种解决方法
Dec 26 Javascript
jQuery中:input选择器用法实例
Jan 03 Javascript
Javascript从数组中随机取出不同元素的两种方法
Sep 22 Javascript
ES6与CommonJS中的模块处理的区别
Jun 13 Javascript
vue监听dom大小改变案例
Jul 29 Javascript
vue+vant实现购物车全选和反选功能
Nov 17 Vue.js
Vue OpenLayer测距功能的实现
Apr 20 Vue.js
JavaScript中style.left与offsetLeft的使用及区别详解
Jun 08 #Javascript
Js+Ajax,Get和Post在使用上的区别小结
Jun 08 #Javascript
jQuery.Uploadify插件实现带进度条的批量上传功能
Jun 08 #Javascript
JS与Ajax Get和Post在使用上的区别实例详解
Jun 08 #Javascript
浅谈JS原生Ajax,GET和POST
Jun 08 #Javascript
原生 JS Ajax,GET和POST 请求实例代码
Jun 08 #Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
Jun 08 #Javascript
You might like
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
jquery异步调用页面后台方法&amp;#8207;(asp.net)
2011/03/01 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
2013/08/02 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
2013/10/29 Javascript
JavaScript中的继承方式详解
2015/02/11 Javascript
jQuery获取checkboxlist的value值的方法
2015/09/27 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
AngularJS中transclude用法详解
2016/11/03 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
详解axios在node.js中的post使用
2017/04/27 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
2017/07/10 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
vue使用keep-alive保持滚动条位置的实现方法
2019/04/09 Javascript
详解JS判断页面是在手机端还是在PC端打开的方法
2019/04/26 Javascript
细说Vue组件的服务器端渲染的过程
2019/05/30 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
详解vue3.0 diff算法的使用(超详细)
2020/07/01 Javascript
Python的Django框架中settings文件的部署建议
2015/05/30 Python
Python入门_浅谈for循环、while循环
2017/05/16 Python
python抓取网页中链接的静态图片
2018/01/29 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
2018/10/22 Python
python 实现return返回多个值
2019/11/19 Python
python中threading开启关闭线程操作
2020/05/02 Python
如何用Python绘制3D柱形图
2020/09/16 Python
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
美国女士时尚珠宝及配饰购物网站:Icing
2018/07/02 全球购物
波兰汽车配件网上商店:iParts.pl
2020/09/08 全球购物
国培计划培训感言
2014/03/11 职场文书
《灰椋鸟》教学反思
2014/04/27 职场文书
现货白银电话营销话术
2015/05/29 职场文书
Mysql文件存储图文详解
2021/06/01 MySQL
python中24小时制转换为12小时制的方法
2021/06/18 Python
Nginx利用Logrotate实现日志分割
2022/05/20 Servers
Python  序列化反序列化和异常处理的问题小结
2022/12/24 Python