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代码判断网页是静态还是伪静态
May 05 Javascript
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
Jun 19 Javascript
基于JavaScript实现div层跟随滚动条滑动
Jan 12 Javascript
基于javascript实现句子翻牌网页版小游戏
Mar 23 Javascript
javascript实现秒表计时器的制作方法
Feb 16 Javascript
js实现点击切换checkbox背景图片的简单实例
May 08 Javascript
Angularjs修改密码的实例代码
May 26 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
May 31 Javascript
jQuery为某个div加入行样式
Jun 09 jQuery
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
Oct 23 Javascript
Node.js中的child_process模块详解
Jun 08 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
Oct 12 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 编程安全性小结
2010/01/08 PHP
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
JS类库Bindows1.3中的内存释放方式分析
2007/03/08 Javascript
基于JQuery的浮动DIV显示提示信息并自动隐藏
2011/02/11 Javascript
jquery选择器-根据多个属性选择示例代码
2013/10/21 Javascript
制作jquery遮罩层效果导航菜单代码分享
2013/12/25 Javascript
jQuery中prevAll()方法用法实例
2015/01/08 Javascript
四种参数传递的形式——URL,超链接,js,form表单
2015/07/24 Javascript
JS绘制生成花瓣效果的方法
2015/08/05 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
js HTML5手机刮刮乐代码
2020/09/29 Javascript
详解使用angular的HttpClient搭配rxjs
2017/09/01 Javascript
Js中async/await的执行顺序详解
2017/09/22 Javascript
vue利用axios来完成数据的交互
2018/03/23 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
JS数组的常用10种方法详解
2020/05/08 Javascript
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
Python安装模块的常见问题及解决方法
2018/02/05 Python
python语言元素知识点详解
2019/05/15 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
django model object序列化实例
2020/03/13 Python
python 牛顿法实现逻辑回归(Logistic Regression)
2020/10/15 Python
ivx平台开发之不用代码实现一个九宫格抽奖功能
2021/01/27 HTML / CSS
关于打架的检讨书
2014/01/17 职场文书
小学生成长感言
2014/01/30 职场文书
收银员岗位职责范本
2015/04/07 职场文书
银行反洗钱宣传活动总结
2015/05/08 职场文书
秋菊打官司观后感
2015/06/03 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书
团队合作精神学习心得体会
2016/01/19 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript
一篇文章弄清楚Ajax请求的五个步骤
2022/03/17 Javascript
JavaScript中10个Reduce常用场景技巧
2022/06/21 Javascript