工作中一直有写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. 采用formdata做跨域的、无刷新、带进度条的文件上传

    以前做无刷新上传,都要用iframe,如果想有进度条,就千难万难,不得不用flash等插件来实现. 现在HTML5终于普及了,筒子们不用再那么痛苦了. 所有这一切都变得异常简单!! 不信?且看如下代码 ...

  2. 单片机中断的IE和IP寄存器(摘抄)

    收藏 评论(0) 分享到 微博 QQ 微信 LinkedIn 一.中断允许寄存器IE    CPU对中断源的开放或中断屏蔽的控制是通过中断允许寄存器IE设置的,IE既可按字节地址寻址(其字节地址为A8 ...

  3. JAVA学习<三>

    1.Java中运算符的优先级: 2.条件语句If: 如果 if 条件成立时的执行语句只有一条,是可以省略大括号滴!但如果执行语句有多条,那么大括号就是不可或缺的. public class Hello ...

  4. mysql学习(二)

    (1)存储过程:存储过程是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理: (2)存储过程优点:增强SQL语句的功能和灵活性,实现较快的执行速度,减少网络流量: (3)存储过程结构 ...

  5. 【译】RabbitMQ:"Hello World"

    简介 RabbitMQ是一个消息代理.从本质上讲,它从消息生产者处接收消息,然后传递给消息的消费者.它在消息的生产者和消费者之间根据你指定的规则对消息进行路由.缓存和持久化. RabbitMQ通常使用 ...

  6. css控制页面打印(分页、屏蔽不需要打印的对象)

    样式: <style   media="print">     .Noprint   {   DISPLAY:   none;}     .PageNext   {   ...

  7. Lua.LearningLua.7-userdata

    Learning Lua: 7 - userdata 1. Userdata basic "There are eight basic types in Lua: nil, boolean, ...

  8. 第三章 深入 ZAB 协议

    上一节介绍了ZAB协议的内容,本节将从系统模型.问题描述.算法描述和运行分析四方面来深入了解 ZAB 协议. 系统模型 在一个由一组进程 n ={P1,P2,...Pn}组成的分布式系统中,每一个进程 ...

  9. OSIC Performance Bot

    https://github.com/lbragstad/keystone-performance

  10. C#保存Base64格式图片

    .前端页面代码 /** * 通过图片本地路径获取图片真实大小,并进行压缩 */ function getLocalRealSize(path, callback) { var img = new Im ...