题记——近期回顾《javaScript高级程序设计》ajax章节,发现书中对封装一个ajax库并不完美,结合之前看到博客,对ajax库做一点点的优化。

参考博客:如何去封装一个ajax库

因为AJAX内容比较基础,关于AJAX的历史发展和实现优点可以自行查找资料。

简单来说

我们用AJAX建立动态网页有四条语句:

var xhr = new XMLHttpRequest;
xhr.onreasystatechange = function () {
if(xhr.readyState == 4 && xhr.status){
alert(xhr.responseText);
}else {
alert("Request was unsuccessful" + xhr.status)
}
}
xhr.open("get","url",true);
xhr.send(null);

AJAX的核心是XHMLHttpRequest,在使用之前应该检测浏览器的兼容问题,因为IE7+、Firefox、Chrome、Safari 以及 Opera均内建 XMLHttpRequest 对象,而IE5 和 IE6 使用 ActiveXObject。所以我们有必要进行判断,让所有浏览器都能正常渲染。

function createXHR() {
var xhr = null;
if (window.XMLHttpRequest) { //处理兼容
xhr = new XMLHttpRequest;
} else {
try {
xhr = new ActiveXobject("Microsoft.XMLHTTP");
} catch (e) {
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
}
}
}
return xhr;
}
var xhr = createXHR();

以上就是类似《js高级程序设计》的判断方法,但这样的话,每次创建xhr对象都会执行createXHR函数,每次都要在函数内部进行判断,由于第一次使用就知道了浏览器的支持类型,这样显然造成了不必要的系统开销。按照惰性思维,我们希望createXHR函数第一次执行的时候就把浏览器的支持类型返回,这样后面每次执行就没必要判断了。可以这么做:

function createXHR() {
var xhr = null,
flag = false,
arr = [
function () {
return new XMLHttpRequest;
},
function () {
return new ActiveXObject("Microsoft.XMLHTTP");
},
function () {
return new ActiveXObject("Msxm12.XMLHTTP");
}
];
for (var i = 0; i < arr.length; i++) {
var curFn = arr[i];
try {
xhr = curFn();
//本次循环获取的方法没有出现错误:说明此方法是我想要的,我们下一次直接执行这个方法即可,,这就需要我把createXHR重写为本次循环得到的方法(完成后不需要再判断下面的,直接退出循环即可)
createXHR = curFn;
flag = true;
break;
} catch (e) {
//本次循环获取的方法执行时出现错误:继续执行下一次循环
}
        }
if (!flag) {
throw new Error("your browser is not support ajax,please change your browser,try again!");
} return xhr;
}
var xhr = createXHR();

现在我们可以正常使用xhr这个对象了,但是现在又有一个问题,每次使用AJAX都要编写那四条语句,显得很没有必要。程序员是低效、单调、重复工作的天敌,所以我们必须想一个办法将AJAX封装,以后直接调用这个方法:

    function ajax(options) {
var _default = {
url : "",
type : "get",
dataType : "json",
async : true,
data : null,
getHeaders : null,
success : null
}
for (var key in options) {
if (options.hasOwnProperty(key)) {
_default[key] = options[key];
}
}
//如果当前的请求方式是GET,我们需要在URL的末尾添加随机数清除缓存
if (_default[type] === "get") {
_deauult[url].indexOf("?") >= 0 ? _default[url] += "&" :_default[url] += "?";
_default[url] += "_=" + Math.random();
}
var xhr = createXHR();
xhr.open(_default[type],_default[url],_default[async]);
xhr.onreadystatechange = function () {
if (/^2\d{2}$/.test(xhr.status)) {
if (xhr.readyState === 2) {
if (typeof(_default[getHeaders]) === "function") {
_default[getHeaders].call(xhr);
} }
if (xhr.readyState == 4) {
var val = xhr.responseText;
if (_default.dataType === "json") {
val = "JSON" in window ? JSON.parse(val) : eval("(" + val + ")");
}
if (typeof(_default[success]) === "function") {
_default[success].call(xhr,val);
}; }
}
}
xhr.send(_default[data]);//向请求主体传内容,但open方法中必须使用post请求方式
}
这就是一个AJAX请求的公共方法,把需要传递的参数值都放在对象options传递进去,再把参数options[key]赋给_default[key]。
PS:vue中经常会用到一个axios库,这个就是对ajax的封装方法,本人水平有限,有错误之处烦请指出

【学习笔记】AJAX内容拓展的更多相关文章

  1. [学习笔记]AJAX学习

    AJAX学习 ——在w3cschool学习AJAX的学习笔记 参考网站:w3cschool XMLHttpRequest 是 AJAX 的基础. XMLHttpRequest 对象 所有现代浏览器均支 ...

  2. Java Script 学习笔记 -- Ajax

    AJAX 一 AJAX预备知识:json进阶 1.1 什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON是用字符串来表示Javas ...

  3. jquery学习笔记----ajax使用

    一.load() 加载页面数据 load(url,[data],[callback]) url:加载的页面地址,[data]传送的数据,[callback]加载完成时回调函数. 设计一个load.ht ...

  4. jquery学习笔记-----ajax

    $(selector).load( url [,date] [,callback] ) url:请求页面的url地址 date:发送至服务器的key:value数据 callback:请求完成时的回调 ...

  5. require.js学习笔记(内容属于转载总结)

    <script data-main="src/app" src="src/lib/require.js"></script> backb ...

  6. 20151207jquery 学习笔记 Ajax

    .load()方法是局部方法,因为他需要一个包含元素的 jQuery 对象作为前缀.而$.get()和 $.post()是全局方法,无须指定某个元素.对于用途而言,.load()适合做静态文件的异步获 ...

  7. 20151205 jquery 学习笔记--Ajax

    Ajax全称为:“Asynchronous JavaScript and XML”(异步 JavaScript 和 XML), 它并不是 JavaScript 的一种单一技术,而是利用了一系列交互式网 ...

  8. 20151223jquery学习笔记--Ajax表单提交

    传统的表单提交, 需要多次跳转页面, 极大的消耗资源也缺乏良好的用户体验. 而这款form.js 表单的 Ajax 提交插件将解决这个问题.一. 核心方法官方网站: http://malsup.com ...

  9. Android学习笔记_10_ContentProvider内容提供者的使用

    一.使用ContentProvider共享数据 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.以前我们学习过文件的操作模式,通过指定文 ...

随机推荐

  1. 多线程安全单例模式学习代码 c++11

    // Singleton.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <mutex> #include & ...

  2. debug,菜鸟必备的求生技能

    突然想写个关于 debug 的文章,来纪念我2天前被自己坑的蠢事…… 前两天,项目的四期送去电科院审查了.因为一些不可描述的原因,我很不喜欢四期.做起来就很烦~临近验收,发现了个比较严重的bug,记录 ...

  3. js的事件委托机制

    如今的JavaScript技术界里最火热的一项技术应该是‘事件委托(event delegation)’了.使用事件委托技术能让你避免对特定的每个节点添加事件监听器:相反,事件监听器是被添加到它们的父 ...

  4. CSS3知识!

    一.引入样式 1.行内样式表 <h1 style="color: red;font-size: 18px;">10-30</h1> 2.内部样式表(在hea ...

  5. 8. American Friendship 美国式的友谊

    8. American Friendship 美国式的友谊 (1) Americans usually consider themselves a friendly people.Their frie ...

  6. (22)Embrace the near win

    https://www.ted.com/talks/sarah_lewis_embrace_the_near_win/transcript?referrer=playlist-talks_to_get ...

  7. centos7安装keepalived问题

    ● keepalived.service - LVS and VRRP High Availability Monitor Loaded: loaded (/usr/lib/systemd/syste ...

  8. 巧用 Jersey RESTful WebService框架解决文件上传乱码

    一.当我们使用jersey框架封装的restful进行文件上传时,会出现中文乱码,试用了过滤器设置编码都不管用.仔细想了很久解决办法,就用一个servelt来代替这个上传的restful接口实现上传的 ...

  9. Python开发——2.基本数据类型之数字和字符串

    一.基本数据类型 基本数据类型包括:数字(int).字符串(str).列表(list).元祖(tuple).字典(dict).布尔值(bool). 查看输出数据的类型 a = "123&qu ...

  10. Codeforces Round #486 (Div. 3) F. Rain and Umbrellas

    Codeforces Round #486 (Div. 3) F. Rain and Umbrellas 题目连接: http://codeforces.com/group/T0ITBvoeEx/co ...