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 相关文章推荐
使用不同的方法结合/合并两个JS数组
Sep 18 Javascript
JavaScript中Cookies的相关使用教程
Jun 04 Javascript
浅谈jQuery的offset()方法及示例分享
Jul 17 Javascript
JS+CSS实现表格高亮的方法
Aug 05 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
Jul 27 Javascript
如何处理JSON中的特殊字符
Nov 30 Javascript
使用vue-aplayer插件时出现的问题的解决
Mar 02 Javascript
浅谈webpack打包之后的文件过大的解决方法
Mar 07 Javascript
jquery点击回车键实现登录效果并默认焦点的方法
Mar 09 jQuery
jQuery超简单遮罩层实现方法示例
Sep 06 jQuery
微信小程序 wepy框架与iview-weapp的用法详解
Apr 10 Javascript
vue-cli3中vue.config.js配置教程详解
May 29 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
不使用php api函数实现数组的交换排序示例
2014/04/13 PHP
php中eval函数的危害与正确禁用方法
2014/06/30 PHP
php正则匹配文章中的远程图片地址并下载图片至本地
2015/09/29 PHP
PHP数组去重比较快的实现方式
2016/01/19 PHP
详解EventDispatcher事件分发组件
2016/12/25 PHP
JQuery的ajax获取数据后的处理总结(html,xml,json)
2010/07/14 Javascript
js兼容的placeholder属性详解
2013/08/18 Javascript
javascript实现点击后变换按钮显示文字的方法
2015/05/13 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
ES6中的箭头函数实例详解
2017/04/06 Javascript
深究AngularJS中$sce的使用
2017/06/12 Javascript
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
vue实现整屏滚动切换
2020/06/29 Javascript
结合axios对项目中的api请求进行封装操作
2020/09/21 Javascript
[01:20]辉夜杯背景故事宣传片《辉夜传说》
2015/12/25 DOTA
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
2016/06/29 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
Python将列表中的元素转化为数字并排序的示例
2019/12/25 Python
python实现对变位词的判断方法
2020/04/05 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
从当地商店送来的杂货:Instacart
2018/08/19 全球购物
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
历史学专业毕业生求职信
2013/09/27 职场文书
园林技术个人的自我评价
2014/01/08 职场文书
集团公司党的群众路线教育实践活动工作总结
2014/03/03 职场文书
绩效管理实施方案
2014/03/19 职场文书
园林设计专业毕业生求职信
2014/03/23 职场文书
婚前协议书怎么写
2014/04/15 职场文书
安全演讲稿大全
2014/05/09 职场文书
党支部特色活动方案
2014/08/20 职场文书
个人求职意向书
2015/05/11 职场文书
优秀学生主要事迹怎么写
2015/11/04 职场文书
实用求职信模板范文
2019/05/13 职场文书
入党转正申请自我鉴定
2019/06/25 职场文书