封装ajax原理

  1. 首先处理 用户如果不传某些参数,设置默认值

    • type默认get
    • 默认url为当前页
    • 默认async方式请求
    • data数据默认为{}
  2. 处理用户传进来的参数对象
    • 遍历,拼接成key=value&key=value形式,加入数组
  3. 通过XMLHttpRequest对象创建xhr,早期的IE浏览器不支持XMLHttpRequest对象,通过var xhr = new ActiveXObject('Msxm12.XMLHTTP')创建
  4. 判断用户请求的方法
    • get:将数据拼接在url后面,
    • post:需要加一个请求头,并且用send方法传递数据
  5. 判断数据是否请求成功
    • xhr.readyState == 4 && xhr.status == 200表示请求成功
  6. 根据服务器端返回的数据类型进行加工,再用callback传递出去
    • 如果返回的是json格式的数据,就转换成js对象json.parse
    • 如果是xml格式,就将DOM文档对象返回
    • 将处理好的数据用callback传递出去
  7. 优化!!!
    • 将用户需要传入的参数挂载到options对象上,用户只需要传入一个对象就可以使用了
function ajax(options){
//默认值的处理,用户不传某些参数的时候,设置一些默认值
//设置type的默认值为get
options.type = options.type || "get";
//设置请求地址的默认值为当前页地址
options.url = options.url || location.href;
// //设置async的默认值
options.async = options.async || "true";
//设置options.data的默认值
options.data = options.data || {}; //处理用户传进来的请求参数(data)对象
//{key: "123", age: 1, gender: "male"}
//key=123&age=1&gender=male
var dataArr = [];
for(var k in options.data){
dataArr.push(k + "=" + options.data[k]);
}
var dataStr = dataArr.join("&"); var xhr = new XMLHttpRequest();
xhr.open(options.type, options.type == "get"? options.url + "?" + dataStr : options.url, options.async); if(options.type == "post"){
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
}
xhr.send(options.type == "get"? null : dataStr); if(options.async){
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
var type = xhr.getResponseHeader("Content-Type");
var result;
if(type.indexOf("json") != -1){
result = JSON.parse(xhr.responseText);
}else if(type.indexOf("xml") != -1){
result = xhr.responseXML;
}else{
result = xhr.responseText;
}
options.success(result);
}
}
}else{
var type = xhr.getResponseHeader("Content-Type");
var result;
if(type.indexOf("json") != -1){
result = JSON.parse(xhr.responseText);
}else if(type.indexOf("xml") != -1){
result = xhr.responseXML;
}else{
result = xhr.responseText;
}
options.success(result);
}
} function get(options){
options.type = "get";
ajax(options);
} function post(options){
options.type = "post";
ajax(options);
} // ajax({
// url: "json.php",
// data: {key: "123", age: 1, gender: "male"},
// success: function(data){
// console.log(data);
// }
// }); get({
url: "json.php",
success: function(data){
console.log(data);
}
}) // ajax({
// url: "xml.php",
// type: "get",
// data: {key: "123", age: 1, gender: "male"},
// success: function(data){
// console.log(data);
// }
// });

  

封装ajax原理的更多相关文章

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

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

  2. Ajax原理,技术封装与完整示例代码

    在做项目和学习的时候,经常用到Ajax的相关技术,但是这方面的技术总是运用的不是十分好,就寻找相关博客来学习加深Ajax技术相关. 一.Ajax简介 二.同步.异步传输区别 2.1 异步传输 2.2 ...

  3. Ajax原理一篇就够了

    Ajax原理一篇就够了 一.什么是Ajax Ajax(Asynchronous JavaScript and XML的缩写)是一种异步请求数据的web开发技术,对于改善用户的体验和页面性能很有帮助.简 ...

  4. 大话AJAX原理

    大话AJAX原理 一.什么是Ajax Ajax(Asynchronous JavaScript and XML的缩写)是一种异步请求数据的web开发技术,对于改善用户的体验和页面性能很有帮助.简单地说 ...

  5. 自封装ajax

    项目中有时候用不到jq,需要了解xmlhttp原理,自己写一套函数请求和发送数据! /* 封装ajax函数 * @param {string}opt.type http连接的方式,包括POST和GET ...

  6. 封装Ajax和跨域

    目录 引言 封装ajax 案例:使用自封装ajax 案例:动态加载瀑布流 跨域 引言 对于Ajax现在相信大家已经不会陌生了,无论是原生的XMLHttpRequest方式发送还是通过jQuery框架中 ...

  7. 一张图搞懂Ajax原理

    本文整理在,我的github上.欢迎Star. 原理 说起ajax,就不得不说他背后的核心对象XMLHttpRequest,而说到XMLHttpRequest我觉得,从它的readyState状态说起 ...

  8. AJAX原理总结

    AJAX全称 Asynchronous JavaScript and XML(异步的JavaScript 和XML) 同步和异步 异步传输是面向字符的传输,单位是字符 同步传输是面向比特,单位是帧,传 ...

  9. 使用原生JS封装Ajax

    使用原生 的JS封装 Ajax,实现 仿JQuery的Ajax,post,get三种异步请求方式: var MAjax = { //根据浏览器创建异步对象 createXhr: function () ...

随机推荐

  1. 只要三步,使用html5+js实现像素风头像生成器

    只要三步,使用html5+js实现像素风头像生成器 html5的画布给我们带来了很大的空间,其实像素风格头像生成器只是用到了画方块的方法.画一个像素头像,只要三步,1.解决像素点,2.解决像素点之间的 ...

  2. 2018-2019-1 20165231 实现mypwd(选做)

    实现mypwd 要求: 学习pwd命令 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 实现mypwd 测试mypwd pwd: 在Linux层次结构中,想要知道当前所处的目录, ...

  3. 工程师的URL大全

    作者:邓聪聪 https://bgp.he.net/ip                    #关于IP地址广播的AS查询及地址所属 http://ipwhois.cnnic.net.cn/    ...

  4. go实现选择排序

    package main import "fmt" func SelectSort(data []int) { length := len(data) for i := 0; i ...

  5. go语言关于值类型和引用类型

    前言:关于值类型和引用类型确实是个比较绕的问题,之前在学校的时候学习C语言的时候,就感觉没有看太懂,后面看java,关于引用也是模模糊糊,这个东西也确实比较抽象,估计好多写了好几年代码的人有也有些迷惑 ...

  6. 浅谈《Linux就该这么学》

    就在去年十月份的时候,偶尔在Linux技术群了看到别人分享的<Linux就该这么学>,好奇的就点进去看看,当时看完首页,突然发现刘遄老师说到心坎里去了,于是就仔细看了看红帽认证的讲解以及后 ...

  7. vue组件路由守卫钩子函数(beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave)

    用法:与mounted,created等同级并列. export default { data() { return { } }, methods: { go() { this.$router.pus ...

  8. js之词法作用域与动态作用域

    事实上JavaScript并不具有动态作用域,它只有词法作用域,简单明了,但是this机制某种程度上很像动态作用域 词法作用域:是一套引擎如何寻找变量以及会在何处找到变量的规则,它是定义在词法阶段的作 ...

  9. Asp.Net Core 使用Swashbuckle.AspNetCore 生成API文档

    详情参考:https://www.cnblogs.com/morang/p/9741511.html github地址:https://github.com/yimogit/moxy.blogs/tr ...

  10. st9720-GB 中文编码对照表

    做嵌入式LED 屏幕显示的时候,需要ST9720 中文编码,网上找了好几个版本,版本不同居然对应的code也不同!找了一个靠谱的pdf版本编码对照表,供大家参考 ..... ..... 下载地址: h ...