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 相关文章推荐
让getElementsByName适应IE和firefox的方法
Sep 24 Javascript
让人蛋疼的JavaScript语法特性
Sep 30 Javascript
jQuery+ajax实现无刷新级联菜单示例
May 21 Javascript
基于JavaScript代码实现随机漂浮图片广告
Jan 05 Javascript
Boostrap模态窗口的学习小结
Mar 28 Javascript
json格式的javascript对象用法分析
Jul 04 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
Oct 24 Javascript
JavaScript中的编码和解码函数
Feb 15 Javascript
vue服务端渲染的实例代码
Aug 28 Javascript
JS实现图片居中悬浮效果
Dec 25 Javascript
用npm-run实现自动化任务的方法示例
Jan 14 Javascript
javascript异常处理实现原理详解
Feb 17 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
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
2014/08/25 PHP
PHP获取表单所有复选框的值的方法
2014/08/28 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
2020/03/18 PHP
jQuery Ajax 全解析
2009/02/08 Javascript
google 搜索框添加关键字实现代码
2010/04/24 Javascript
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
javascript相等运算符与等同运算符详细介绍
2013/11/09 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
2016/10/26 Javascript
JavaScript实现动态增删表格的方法
2017/03/09 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
JS数组实现分类统计实例代码
2018/09/30 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
微信小程序实现批量倒计时功能
2020/11/01 Javascript
微信小程序 调用远程接口 给全局数组赋值代码实例
2019/08/13 Javascript
微信小程序保存图片到相册权限设置
2020/04/09 Javascript
Python内置的字符串处理函数整理
2013/01/29 Python
Python进程通信之匿名管道实例讲解
2015/04/11 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
2018/07/13 Python
django 发送邮件和缓存的实现代码
2018/07/18 Python
tensorflow 中对数组元素的操作方法
2018/07/27 Python
使用Python获取网段IP个数以及地址清单的方法
2018/11/01 Python
Python中最大递归深度值的探讨
2019/03/05 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
Python web如何在IIS发布应用过程解析
2020/05/27 Python
Python3交互式shell ipython3安装及使用详解
2020/07/11 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
美国领先的商务贺卡出版商:The Gallery Collection
2018/02/13 全球购物
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
英国最大的独立玩具专卖店:The Entertainer
2019/09/06 全球购物
毕业生求职自荐书范文
2014/03/27 职场文书
材料专业大学毕业生自荐书
2014/07/02 职场文书
不同意离婚答辩状
2015/05/22 职场文书
校园开放日新闻稿
2015/07/17 职场文书
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android