前沿:对于此篇随笔,完是简要写了几个重要的地方,具体实现细节完在提供的源码做了笔记

<一>ajax基本要点介绍--更好的介绍ajax

1. ajax对象中new XMLHttpRequest()属性和方法列表

2. 常用事件介绍

事件 触发时机
onreadystatechange 当readyState的值改变时触发,除了当它从非0变成0时
onloadstart 当调用send方法时会触发xhr.onloadstart,然后会触发xhr.upload.onloadstart,代表开始上传数据
onprogress 上传数据过程中会触发xhr.upload.onprogress,下载数据过程中会触发xhr.onprogress,onprogress每50ms会触发一次
onabort 调用abort方法后会触发
onerror 当发生网络异常的时候会触发,如果上传数据的过程还未结束,此时会先触发xhr.upload.onerror,然后再触发xhr.onerror;如果上传数据的过程已经结束,此时只会触发xhr.onerror
onload 上传数据成功,会触发xhr.upload.onload;下载数据成功会触发xhr.onload
ontimeout 当服务端响应的时间超过指定的timeout时间时,会触发此事件
onloadend 上传数据完成(成功或者失败)时会触发xhr.upload.onloadend;下载数据完成(成功或失败)会触发

3. 请求开始和结束零界点

【3.1】请求开始

  xhr.onloadstart事件触发的时候,也就是你调用xhr.send()方法的时候。
因为xhr.open()只是创建了一个连接,但并没有真正开始数据的传输,而xhr.send()才是真正开始了数据的传输过程。只有调用了xhr.send(),才会触发xhr.onloadstart 。

【3.2】请求结束

  xhr.loadend事件触发的时候

备注:

  a.可以在 send()之后再设置此xhr.timeout,但计时起始点仍为调用xhr.send()方法的时刻。

  b.当xhr为一个sync同步请求时,xhr.timeout必须置为0,否则会抛错。原因可以参考本文的【如何发一个同步请求】一节。

4. 具体实现细节--封装ajax

function _ajax(obj){
var xhr = null;
// 创建-非IE6 : IE6及其以下浏览器
if(window.XMLHttpRequest){
xhr=new XMLHttpRequest();
//针对某些特定版本的Mozillar浏览器的BUG进行修正
if(xhr.overrideMimeType) {
xhr.overrideMimeType("text/xml");
}
}else if(window.ActiveXObject){
var arr = ['MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
for(var i = 0; i < arr.length; i++){
try {
xhr = new ActiveXObject(arr[i]);
break;
}catch (e){
console.log(e);
}
}
} // 默认是异步请求
var asyc = obj.asyc || true;
var type = obj.type.toUpperCase() || "GET";
var url = obj.url;
var data = obj.data || {}; console.log(objToStr(data)); //选择发送请求方式
if(type === "GET"){
xhr.open(type,url+'?'+objToStr(data),asyc);
xhr.send();
}else if(type === "POST"){
xhr.open(type,url,asyc);
// 告诉后台传的是什么
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
// xhr.setRequestHeader('Last-Modified', 'faqenfaAWASVaewfc');
xhr.send(objToStr(data));
} // 设置超时请求时间
xhr.timeout = 3000; // 发送异步回调函数
xhr.onreadystatechange = function () {
console.log(xhr.readyState);
// 测试追踪ajax处于那种状态,在正式代码中要隐藏此switch
switch (xhr.readyState){
case 0:
console.log('xhr对象被成功构造,open()方法还未被调用');
break;
case 1:
console.log('open()方法已被成功调用,send()方法还未被调用');
break;
case 2:
console.log('send()方法已经被调用, 响应头和响应状态已经返回');
break;
case 3:
console.log('响应体(response entity body)正在下载中,此状态下通过xhr.response可能已经有了响应数据');
break;
case 4:
console.log('整个数据传输过程结束,不管本次请求是成功还是失败');
break;
} if(xhr.readyState === 4 && xhr.status === 200){
obj.success(xhr.responseText)
}else {
obj.error && obj.error();
}
}; // 请求开始
xhr.onloadstart = function (e) {
console.log(e,'start');
}; //ajax请求结束
xhr.loadend = function (e) {
console.log(e,'end');
}; // 超时函数处理
xhr.ontimeout = function (e) {
obj.timeout && obj.timeout();
console.log(e,'timeout');
}; // ajax请求错误处理
xhr.onerror = function (e) {
obj.errorAsyc && obj.errorAsyc();
console.log(e,'error');
}; // 上传进度处理--upload用于在数据传输到服务器时收集一些传输信息,比如上传了多少字节,总共多少字节等,其里面还包含了一些事件回调
xhr.upload.onprogress = function (e) {
obj.progress && obj.progress();
console.log(e,'progress');
}; console.log(xhr.getAllResponseHeaders(),'0000');
// 把对象转换成字符串
function objToStr(obj) {
var arr = [];
for(var key in obj){
arr.push(key+'='+obj[key])
}
return arr.join('&');
}
}

【封装ajax调用方式】

   window.onload = function () {
btn.onclick= function () {
_ajax({
url:'http://localhost:8800',
type:'post',
asyc:true, //默认是true
data:{
username:'zhange',
password:'123456'
},
success:function (data) {
console.log(data);
},
error:function () { }
});
}
};

原生ajax解析&封装原生ajax函数的更多相关文章

  1. 原生ajax与封装的ajax使用方法

    当我们不会写后端接口来测试ajax时,我们可以使用node环境创建一个本地服务器. 1.创建一个本地服务器可参考http://www.cnblogs.com/heyujun-/p/6793900.ht ...

  2. js实现原生Ajax的封装及ajax原理详解

    原理及概念 AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是一种用于创建快速动态网页的技术. 动态网页:是指可以通过服务器语言结合数 ...

  3. Ajax的封装,以及利用jquery的ajax获取天气预报

    1.Ajax的封装 function ajax(type,url,param,sync,datetype,callback){//第一个参数是获取数据的类型,第二个参数是传入open的url,第三个是 ...

  4. 原生实现ajax解析--XMLHttpRequest

    ajax基础: Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求. 如果仔细观察一个Form的提交,你就会发现,一旦用户点击“Submit ...

  5. js原生Ajax 的封装和原理

    原理及概念 AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是一种用于创建快速动态网页的技术. 动态网页:是指可以通过服务器语言结合数 ...

  6. 原生封装的ajax

    原生封装的ajax的代码如下: //将数据转换成 a=1&b=2格式; function json2url(json){ var arr = []; //加随机数防止缓存; json.t = ...

  7. js原生Ajax的封装与使用

    一.原生Ajax代码的封装如下: (function() { var XHR = { createStandardXHR: function() { return new XMLHttpRequest ...

  8. JavaScript的原生Ajax解析

    通过JavaScript的Ajax进行详细的解析过程,从而更好的了解Jquery的Ajax. 顺带,我会在后面把我整理的一整套CSS3,PHP,MYSQL的开发的笔记打包放到百度云,有需要可以直接去百 ...

  9. javascript - 封装原生js实现ajax

    1 /* * ajax方法 */ var Ajax = function() { var that = this; //创建异步请求对象方法 that.createXHR = function() { ...

随机推荐

  1. OpenShift 4.2 离线安装补充记录

    OpenShift4.2详细安装参考同事王征的安装手册(感谢王征大师的研究和答疑解惑, 大坑文章都已经搞定了,我这里是一些小坑) https://github.com/wangzheng422/doc ...

  2. 工控随笔_23_WinCC报Application CCArchiveConnMon.exe could not establish a connection to the Win CC license server

    西门子的软件都是比较庞大的,安装一个软件要很长时间,而且安装的过程中很容易因为系统兼容性问题导致不能成功安装的情况, 而有时还会出现安装成功,但是不能正常使用的情况.这个时候就很麻烦,一般除了重装系统 ...

  3. 问题解决: 此文件来自其他计算机,可能被阻止以帮助保护该计算机/WORD在试图打开文件时遇到错误……

    最近,在打开下载的office文档(包括word.excel.ppt等)时候,总是无法直接打开,错误提示如下: 无论是邮件中的还是别的网站下载的,均提示该错误.后来搜索相关资料发现,修改其文件属性即可 ...

  4. [Arch] 域名解析常用两步设置

    主站   A 记录        (对应IPv4)   主机记录: @ (表示解析到不带 www 主域名)   值为 IP 主站 CNAME 记录 (表示别名) 主机记录: www   (表示解析到带 ...

  5. 【Spring Boot学习之六】Spring Boot整合定时任务&异步调用

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2一.定时任务1.启动类添加注解@EnableScheduling 用于开启定时任务 package com.wjy; i ...

  6. 最新 多点Dmalljava校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.多点Dmall等10家互联网公司的校招Offer,因为某些自身原因最终选择了多点Dmall.6.7月主要是做系统复习.项目复 ...

  7. DRF框架(四)——单整体改(put)、单局部改(patch)、群局部改(patch)

    单整体改   单指的是单独一条数据,整体指这条数据的所有字段都必须传值修改 基于上篇文章的代码修改,序列化层不用变,只修改views.py 1) 单整体改,说明前台要提供修改的数据,那么数据就需要校验 ...

  8. CSS3弹性盒布局方式

    一.CSS3弹性盒子 弹性盒子是CSS3的一种新布局模式. CSS3 弹性盒( Flexible Box 或 flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的 ...

  9. KEPServerEX 6 配置连接 Allen-Bradley MicroLogix 1400

    =============================================== 2019/7/28_第1次修改                       ccb_warlock == ...

  10. Netty源码分析之NioEventLoop(三)—NioEventLoop的执行

    前面两篇文章Netty源码分析之NioEventLoop(一)—NioEventLoop的创建与Netty源码分析之NioEventLoop(二)—NioEventLoop的启动中我们对NioEven ...