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 相关文章推荐
javascript 写类方式之六
Jul 05 Javascript
JS去除字符串的空格增强版(可以去除中间的空格)
Aug 26 Javascript
用js实现的自定义的对话框的实现代码
Mar 21 Javascript
js 单击式的下拉菜单效果实例
Aug 13 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
Jul 01 Javascript
JS添加或修改控件的样式(Class)实现方法
Oct 15 Javascript
jQuery实现简单的滑动导航代码(移动端)
May 22 jQuery
webpack3+React 的配置全解
Aug 21 Javascript
vue滚动轴插件better-scroll使用详解
Oct 17 Javascript
基于vue2.0实现简单轮播图
Nov 27 Javascript
vue 详情跳转至列表页实现列表页缓存
Mar 27 Javascript
layui表格数据重载
Jul 27 Javascript
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
实用函数8
2007/11/08 PHP
PHP实现MySQL更新记录的代码
2008/06/07 PHP
四个PHP非常实用的功能
2015/09/29 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
2016/03/29 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
2017/02/15 PHP
JavaScript 密码强度判断代码
2009/09/05 Javascript
jQuery实现信息提示框(带有圆角框与动画)效果
2015/08/07 Javascript
基于jQuery的Web上传插件Uploadify使用示例
2016/05/19 Javascript
Bootstrap使用基础教程详解
2016/09/05 Javascript
bootstrap基础知识学习笔记
2016/11/02 Javascript
bootstrap datetimepicker2.3.11时间插件使用
2016/11/19 Javascript
JS实现图片上传预览功能
2016/11/21 Javascript
JavaScript创建对象的七种方式全面总结
2017/08/21 Javascript
vue实现购物车抛物线小球动画效果的方法详解
2019/02/13 Javascript
vue登录以及权限验证相关的实现
2019/10/25 Javascript
es6中使用map简化复杂条件判断操作实例详解
2020/02/19 Javascript
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
用Python的pandas框架操作Excel文件中的数据教程
2015/03/31 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
详解Python的三种可变参数
2019/05/08 Python
python多线程下信号处理程序示例
2019/05/31 Python
Django中信号signals的简单使用方法
2019/07/04 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
2020/06/08 Python
python转化excel数字日期为标准日期操作
2020/07/14 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
英国高街电视:High Street TV
2018/05/22 全球购物
校领导推荐信
2013/11/01 职场文书
女娲补天教学反思
2014/02/05 职场文书
红领巾心向党演讲稿
2014/09/10 职场文书
2014年人力资源工作总结
2014/11/19 职场文书
展览会邀请函
2015/02/02 职场文书
导游词之河北滦平金山岭长城
2019/10/16 职场文书