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 图片等比例缩放代码
May 13 Javascript
jQuery 表单验证扩展(三)
Oct 20 Javascript
js两行代码按指定格式输出日期时间
Oct 21 Javascript
ANT 压缩(去掉空格/注释)JS文件可提高js运行速度
Apr 15 Javascript
JavaScript中for..in循环陷阱介绍
Nov 12 Javascript
jquery实现一个简单的表单验证实例
Mar 30 Javascript
js实现页面跳转的几种方法小结
May 16 Javascript
js实现动态创建的元素绑定事件
Jul 19 Javascript
详解Angular的数据显示优化处理
Dec 26 Javascript
详解React-Router中Url参数改变页面不刷新的解决办法
May 08 Javascript
mpvue构建小程序的方法(步骤+地址)
May 22 Javascript
对Vue beforeRouteEnter 的next执行时机详解
Aug 25 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
分享下php5类中三种数据类型的区别
2015/01/26 PHP
JavaScript实现滚动栏效果的方法
2015/04/27 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
2018/01/15 PHP
10个实用的脚本代码工具
2010/05/04 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
2016/10/20 Javascript
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
基于Vue2x的图片预览插件的示例代码
2018/05/14 Javascript
vue使用Element组件时v-for循环里的表单项验证方法
2018/06/28 Javascript
微信小程序+云开发实现欢迎登录注册
2019/05/24 Javascript
Angular 多模块项目构建过程
2020/02/13 Javascript
[14:50]2018DOTA2亚洲邀请赛开幕式
2018/04/03 DOTA
Python实现简单登录验证
2016/04/13 Python
再谈Python中的字符串与字符编码(推荐)
2016/12/14 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
BOSE德国官网:尽探索之力,享音乐之极
2016/12/11 全球购物
餐厅总经理岗位职责
2013/12/31 职场文书
本科毕业生求职自荐信
2014/02/03 职场文书
计算机数据库专业职业生涯规划书
2014/02/08 职场文书
安全生产中长期规划实施方案
2014/02/21 职场文书
市场部经理岗位职责
2014/04/10 职场文书
酒店开业庆典策划方案
2014/05/28 职场文书
企业形象策划方案
2014/05/29 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
放射科岗位职责
2015/02/14 职场文书
党员发展大会主持词
2015/07/03 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书
浅谈golang package中init方法的多处定义及运行顺序问题
2021/05/06 Golang
Linux安装Docker详细教程
2022/07/07 Servers