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
Nov 25 Javascript
IE 条件注释详解总结(附实例代码)
Aug 29 Javascript
JavaScript执行效率与性能提升方案
Dec 21 Javascript
JS中使用sort结合localeCompare实现中文排序实例
Jul 23 Javascript
javascript处理a标签超链接默认事件的方法
Jun 29 Javascript
超赞的jQuery图片滑块动画特效代码汇总
Jan 25 Javascript
node模块机制与异步处理详解
Mar 13 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
Jul 01 Javascript
基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)
Aug 10 Javascript
vue实现验证码按钮倒计时功能
Apr 10 Javascript
jQuery zTree插件使用简单教程
Aug 16 jQuery
js中forEach,for in,for of循环的用法示例小结
Mar 14 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
多重?l件?合查?(二)
2006/10/09 PHP
收集的DedeCMS一些使用经验
2007/03/17 PHP
PHP中使用cURL实现Get和Post请求的方法
2013/03/13 PHP
PHP rawurlencode与urlencode函数的深入分析
2013/06/08 PHP
php自动获取关键字的方法
2015/01/06 PHP
用js遍历 table的脚本
2008/07/23 Javascript
js控制frameSet示例
2013/09/10 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
JavaScript实现列表分页功能特效
2015/05/15 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
nodejs和C语言插入mysql数据库乱码问题的解决方法
2017/04/14 NodeJs
JS实现按钮控制计时开始和停止功能
2017/07/27 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
Vue学习之常用指令实例详解
2020/01/06 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
[00:32]2018DOTA2亚洲邀请赛Mineski出场
2018/04/04 DOTA
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
2017/11/08 Python
python opencv 图像尺寸变换方法
2018/04/02 Python
Python解决八皇后问题示例
2018/04/22 Python
python之文件读取一行一行的方法
2018/07/12 Python
python 利用for循环 保存多个图像或者文件的实例
2018/11/09 Python
对dataframe数据之间求补集的实例详解
2019/01/30 Python
深入解析Python小白学习【操作列表】
2019/03/23 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
使用Django清空数据库并重新生成
2020/04/03 Python
纯CSS3制作页面切换效果的实例代码
2019/05/30 HTML / CSS
美国性感内衣店:Yandy
2018/06/12 全球购物
心理健康教育心得体会
2013/12/29 职场文书
加工操作管理制度
2014/01/19 职场文书
操行评语大全
2014/04/30 职场文书
先进教师个人总结
2015/02/11 职场文书
创业计划书之宠物店
2019/09/19 职场文书
JS + HTML 罗盘式时钟的实现
2021/05/21 Javascript
利用 SQL Server 过滤索引提高查询语句的性能分析
2021/07/15 SQL Server