【学习笔记】AJAX内容拓展
题记——近期回顾《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内容拓展的更多相关文章
- [学习笔记]AJAX学习
AJAX学习 ——在w3cschool学习AJAX的学习笔记 参考网站:w3cschool XMLHttpRequest 是 AJAX 的基础. XMLHttpRequest 对象 所有现代浏览器均支 ...
- Java Script 学习笔记 -- Ajax
AJAX 一 AJAX预备知识:json进阶 1.1 什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON是用字符串来表示Javas ...
- jquery学习笔记----ajax使用
一.load() 加载页面数据 load(url,[data],[callback]) url:加载的页面地址,[data]传送的数据,[callback]加载完成时回调函数. 设计一个load.ht ...
- jquery学习笔记-----ajax
$(selector).load( url [,date] [,callback] ) url:请求页面的url地址 date:发送至服务器的key:value数据 callback:请求完成时的回调 ...
- require.js学习笔记(内容属于转载总结)
<script data-main="src/app" src="src/lib/require.js"></script> backb ...
- 20151207jquery 学习笔记 Ajax
.load()方法是局部方法,因为他需要一个包含元素的 jQuery 对象作为前缀.而$.get()和 $.post()是全局方法,无须指定某个元素.对于用途而言,.load()适合做静态文件的异步获 ...
- 20151205 jquery 学习笔记--Ajax
Ajax全称为:“Asynchronous JavaScript and XML”(异步 JavaScript 和 XML), 它并不是 JavaScript 的一种单一技术,而是利用了一系列交互式网 ...
- 20151223jquery学习笔记--Ajax表单提交
传统的表单提交, 需要多次跳转页面, 极大的消耗资源也缺乏良好的用户体验. 而这款form.js 表单的 Ajax 提交插件将解决这个问题.一. 核心方法官方网站: http://malsup.com ...
- Android学习笔记_10_ContentProvider内容提供者的使用
一.使用ContentProvider共享数据 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.以前我们学习过文件的操作模式,通过指定文 ...
随机推荐
- Oracle学习——第一章
Oracle数据库特点:安全性高,数据类型丰富 Oracle是由美国甲骨文公司开发的一款数据库产品 -------------------------------------------------- ...
- 移动端web兼容各种分辨率写法
移动端web开发最好用rem单位,再设置以下js,以iphone6 750*1334为基准 <script> var size = document.documentElement.cli ...
- Python10/24--组合/封装/property装饰器/多态
组合的应用: 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. 如何用组合 '''class Foo: aaa=111 ...
- android activity之间用广播传输数据
发送者: Intent intent = new Intent("com.BroadcastAction"); intent.putExtra("result" ...
- 10.18 nslookup:域名查询工具
功能说明 nslookup命令是常用的域名解析查询工具. 如果系统没有nslookup命令,则需要安装下面的软件包: yum-y inatall bind-otil9 语法格式 nslookup ...
- h5移动网页唤起App
最近这个困惑了很久,不断的有一些坑,目前还有疑问关于iOS唤起无效时会出现弹框的问题,这个最后再说 1.首先可能需要判断当前浏览器的来源(目前开发的App还没有上架,所以针对腾讯出品的大家广为人知的微 ...
- Unity、C#读取XML
有如下XML文件: <?xml version="1.0" encoding="UTF-8"?> <DataNode> <prov ...
- python3 与 Django 连接数据库报错:ImportError: No module named 'MySQLdb'
在 python2 中,使用 pip install mysql-python 进行安装连接MySQL的库,使用时 import MySQLdb 进行使用 在 python3 中,改变了连接库,改为了 ...
- Explain Shell 网站(解释各种Shell命令)
[Explain Shell 网站] 调用语法: https://explainshell.com/explain?cmd= shell命令 示例 结果如下图:
- iOS中的HTTPS
在WWDC 15,Apple提出的ATS (App Transport Security) ,是 Apple 在推进网络通讯安全的一个重要方式.在 iOS 9 和 OS X 10.11 中,默认情况下 ...