工作中一直有写JS,也一直有用jquery,在感受jquery便利之余,也对它产生了依赖,已至于许多功能只知使用而不知原生写法,就像ajax。

今天不小心翻看了以前学习的视频,温故了一下原生ajax写法及原理,正好捣鼓捣鼓。这也是面试经常会遇到的问题,动手封装下原生的ajax函数何乐而不为了,代码如下:

function ajaxfn(obj){
/*传入一个json对象
*type:为请求方式,如get,post
*data:传输的数据
*async:异步请求,默认为true
*dataType:返回的数据类型
*url:这请求地址
*fnok:为请求成功时的回调,默认传入返回的数据
*fnerror:为请求失败的回调,默认传入当前的服务器状态码,如500,404
*/
var xhr=null,
type=obj.type?obj.type.toLowerCase():"get",//默认是get
url=obj.url,
data=obj.data?JSON.stringify(obj.data):null,
dataType=obj.dataType?obj.dataType.toLowerCase():"text",
async=true;//默认是异步
if(obj.async==false){
async=false;
}
//创建XMLHttpRequest对象
try{
xhr=new XMLHttpRequest();
}catch(e){
//兼容ie6
xhr=new ActiveXObject('Microsoft.XMLHTTP');
}
//连接服务器
xhr.open(type,url,async);
//发送请求
if(type=="post"){//如果是post请求得先设置请求头,application/x-www=form-urlencoded适合绝大多数的应用场景
xhr.setRequestHeader("content-type","application/x-www=form-urlencoded");
}
xhr.send(data);
//监听过程
xhr.onreadystatechange=function(){
/*readyState请求状态
*0:请求未初始化(还没有调用open())
*1:请求已经建立,但是还没有发送(还没有调用send())
*2:请求已发送,正在处理中(通常现在可以从响应中获取内容头)。
*3:请求处理中,通常响应中已有部分数据可用了,但是服务器还没有完成响应的生成。
*4:响应已经完成;可以获取并使用服务器的响应了.
*/
if(xhr.readyState==4){//请成完成
/*常用http状态码
*200:服务器成功返回网页
*304:未修改,使用缓存
*403:服务器拒绝请求
*404:请求的网页不存在
*503:服务器暂时不可用
*500:服务器内部错误
*/
if(xhr.status==200){//返回成功
switch (dataType){
case "text"://接收到字符串
obj.fnok && obj.fnok(xhr.responseText);
break;
case "json"://接收到json字符串数据
obj.fnok && obj.fnok(JSON.parse(xhr.responseText));
break;
case "xml"://接收到xml格式数据
obj.fnok && obj.fnok(xhr.responseXML);
break;
}
}else{
obj.fnerror && obj.fnerror(xhr.status);
}
}
}
}
}

注:为了兼容IE6,ie7,ie8(兼容模式)支持JSON对象的stringify(),parse()方法,引入了一个json2.js文件,文件下载地址如下:https://github.com/douglascrockford/JSON-js

使用示例如下:

ajaxfn({
type:'get',//请求方式
url:'test.txt',//请求地址
dataType:'text',//返回的数据类型
fnok:function(data){//请求成功的回调
alert(data);
},
fnerror:function(data){//请求失败的回调
alert(data);
}
});

个人知识有限,如有错误的地方,望指正,共同学习共同进步!

ajax温习的更多相关文章

  1. Ajax 简述

    说到Ajax大家一定不陌生,但是真要具体说说它是什么?估计给出完整定义的人应该不多. W3C上给Ajax的具体定义为: AJAX = Asynchronous JavaScript and XML(异 ...

  2. 从头开始一步一步实现EF6+Autofac+MVC5+Bootstarp极简的实现前后台ajax表格展示及分页实现

    本来是想试着做一个简单OA项目玩玩的,真是不做不知道,一做吓死人,原来以为很简单的事情,但是做起来不是忘这就是忘那的,有的技术还得重新温习.所以还是得记录.免得哪天电脑挂了,就全没有了. 开始是看了园 ...

  3. 框架基础:ajax设计方案(一)---集成核心请求

    报告,我要说话!xp被历史淘汰了,IE6 say goodbye了,太TM开心了,从此不要兼容IE6了,哈哈哈哈哈哈 报告,我要说话!IE这sb为啥不早点被杀掉呢,找工作听说要兼容IE,立马软了,唉唉 ...

  4. 前端通信:ajax设计方案(一)---集成核心请求

    报告,我要说话!xp被历史淘汰了,IE6 say goodbye了,太TM开心了,从此不要兼容IE6了,哈哈哈哈哈哈 报告,我要说话!IE这sb为啥不早点被杀掉呢,找工作听说要兼容IE,立马软了,唉唉 ...

  5. AJAX 相关笔记

    AJAX (Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)). 平时工作中使用ajax的频率挺高的,这里整理了一些ajax相关的小知识,后续 ...

  6. jQuery之ajax实现篇

    jQuery的ajax方法非常好用,这么好的东西,你想拥有一个属于自己的ajax么?接下来,我们来自己做一个简单的ajax吧. 实现功能 由于jq中的ajax方法是用了内置的deferred模块,是P ...

  7. Ajax及跨域

    概念 Ajax Ajax,Asynchronous JavaScript and XML,字面意思:异步的 JavaScript 和 XML,是指一种创建交互式网页应用的网页开发技术. 用于异步地去获 ...

  8. 前端框架 EasyUI (0) 重新温习(序言)

    几年前,参与过一个项目.那算是一个小型的信息管理系统,BS 结构的,前端用的是基于 jQuery 的 EasyUI 框架. 我进 Team 的时候,项目已经进入开发阶段半个多月了.听说整个项目的框架是 ...

  9. 一个粗心的Bug,JSON格式不规范导致AJAX错误

    一.事件回放  今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...

随机推荐

  1. super

    [super] Return a proxy object that delegates method calls to a parent or sibling class of type. This ...

  2. php.ini 不生效问题extension

    date.timezone = PRC extension_dir = "ext"

  3. 编辑器sublime text3 破解码

    第一段亲测有效 —– BEGIN LICENSE —–Ryan ClarkSingle User LicenseEA7E-8124792158A7DE B690A7A3 8EC04710 006A5E ...

  4. 第三十九章 微服务CICD(1)- gitlab搭建与使用(docker版)

    一.下载docker镜像 前提:docker引擎已经安装好. docker pull gitlab/gitlab-ce gitlab是8.13.1版本. 二.启动应用 docker run -d -h ...

  5. jQuery中的事件和动画——《锋利的jQuery》(第2版)读书笔记2

    第4章 jQuery中的事件和动画 jQuery中的事件 加载DOM $(document).ready(function(){   // 编写代码... }); 可以简写成: $(function( ...

  6. CSS3--响应式布局

    一.流式布局 不再使用px作为盒模型布局,而是采用百分比布局宽高,定位等. 公式:目标元素宽度/上下文元素宽度=百分比宽度 目标定位/上下文元素宽度或高度=定位距离(保留5位小数点) 用em/rem来 ...

  7. Unity3D手游开发日记(8) - 运动残影效果

    2D游戏的残影很简单,美术做序列帧图片就行了,那么3D游戏的残影美术做不了,得靠程序员动态创建模型来处理. 实现原理也很简单: 1.间隔一定时间创建一个残影模型 GameObject go = Gam ...

  8. dede channelartlist 中引用channel 并且设置当前选择类的样式,currentstyle暂时没有效果.特发求助!!!!

    在dede中需要达到当前选择了该类,样式不同的话.如果是channelartlist 的话. 可以使用下面的情况: {dede:channelartlist typeid='6' row='3' cu ...

  9. sed初学

    1.连接多个sed命令,使用;号 2.批量修改文本中匹配到相应字符串的行 例如,将文本中log_server_port = "12345" 的12345修改成变量中存储的值 sed ...

  10. Jquery点击发送按钮后,按钮文本倒计时

    1.html代码 <input type="number" id="mobileNo" placeholder="请输入手机号" /& ...