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 相关文章推荐
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
Oct 17 Javascript
AngularJS学习笔记之基本指令(init、repeat)
Jun 16 Javascript
使用js复制链接中的部分文字的方法
Jul 30 Javascript
页面内容排序插件jSort使用方法
Oct 10 Javascript
基于JavaScript获取鼠标位置的各种方法
Dec 16 Javascript
JavaScript表单验证开发
Nov 23 Javascript
JS实现批量上传文件并显示进度功能
Jun 27 Javascript
jQuery plugin animsition使用小结
Sep 14 jQuery
koa2使用ejs和nunjucks作为模板引擎的使用
Nov 27 Javascript
angular4应用中输入的最小值和最大值的方法
May 17 Javascript
vue 获取视频时长的实例代码
Aug 20 Javascript
react中useState使用:如何实现在当前表格直接更改数据
Aug 05 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学习之整理字符串
2011/04/17 PHP
使用Apache的htaccess防止图片被盗链的解决方法
2013/04/27 PHP
实例讲解PHP面向对象之多态
2014/08/20 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
类之Prototype.js学习
2007/06/13 Javascript
js 获取中文拼音,Select自动匹配字母获取值的代码
2009/09/23 Javascript
Javascript 实现的数独解题算法网页实例
2013/10/15 Javascript
JS JSON对象转为字符串的简单实现方法
2013/11/18 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
2014/01/11 Javascript
javascript实现存储hmtl字符串示例
2014/04/25 Javascript
JavaScript新增样式规则(推荐)
2016/07/19 Javascript
通过JS获取Request.QueryString()参数的值实现方法
2016/09/27 Javascript
JavaScript数组复制详解
2017/02/02 Javascript
node.js+jQuery实现用户登录注册AJAX交互
2017/04/28 jQuery
深入理解Nodejs Global 模块
2017/06/03 NodeJs
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
python协程用法实例分析
2015/06/04 Python
Python抓取淘宝下拉框关键词的方法
2015/07/08 Python
python中enumerate函数遍历元素用法分析
2016/03/11 Python
python实现定时提取实时日志程序
2018/06/22 Python
django 实现编写控制登录和访问权限控制的中间件方法
2019/01/15 Python
JupyterNotebook 输出窗口的显示效果调整实现
2020/09/22 Python
css3的transition属性详解
2014/12/15 HTML / CSS
值得收藏的HTML5资源(学习html5的朋友可以收藏下)
2010/07/20 HTML / CSS
html5自定义video标签的海报与播放按钮功能
2019/12/04 HTML / CSS
美国在线珠宝商店:SZUL
2017/02/11 全球购物
煤矿安全协议书
2014/08/20 职场文书
2015年基层党组织公开承诺书
2015/01/21 职场文书
保送生自荐信范文
2015/03/26 职场文书
通知格式
2015/04/27 职场文书
python学习之panda数据分析核心支持库
2021/05/07 Python
Win11应用商店打开闪退怎么解决? win11应用商店打不开的多种解决办法
2022/04/05 数码科技
Python序列化模块JSON与Pickle
2022/06/05 Python
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers