ajax(即:Asynchronous JavaScript and XML(异步的 JavaScript 和 XML))经常在用,却经常忽略了底层的实现机制,今日写个小工具,大家也可拿去使用,如果写博客时需要引用时,请显著地注明出处,以尊重劳动成果,谢谢~

  声明:本文仅讲述关于:JavaScript的ajax工具类设计ajax规范设计者开放了哪些接口、以及ajax使用Demo

零、推荐文献

  [1] 轻量级AJAX库-搜狗实验室ajax.js

  [2] 跨域问题小结

一、Chrome控制台网络调试小工具[方便、快捷、易用]

var xml = new XMLHttpRequest();
xml.withCredentials = true; // 开启Cookie,启用会话机制
var url = "http://10.66.1.1/abc.jsp";
xml.open('POST', url, true);
xml.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xml.send("score=5&abc=6");

  But,注意一个问题:不同的ajax请求对象,如何保持会话Session/Cookie的问题 

  如果ajax对象不主动设置xml.withCredentials=true(携带Cookie),则Chrome控制台每new XMLHttpRequest()一次ajax请求对象,就是新建一次会话

 

二、Ajax Util工具类设计

  文末处,附属个人的一些笔记的截图(确实值得一阅)。如有不妥之处,还请大家指正,共同进步~

/**
* Ajax Util
*
* @Author JohnnyZen
* @DateTime 2017-11-22
* @copyright [johnny.weily]
* @license [license]
* @version [version]
* @link http://www.johnnyzen.cn/
* @required itemX
*
* @param option { url[,method][,data][,async][,dataType]}
*
* @method 设置option,初始化ajax
* @method complete:请求完成时运行的函数(在请求成功或失败之后均调用,即在success和error函数之后)
* complete:function(responseText,status,event){}
* complete:function(xhr,status){}
* @method success:当请求成功时运行的函数
* success:function(responseText,status,event){}
* success:function(response,status,xhr){}
* @method error:请求出错时候的函数
* error:function(xhr,status,error){}
*
* @notice xhr 用于创建 XMLHttpRequest 对象的函数
* @notice event.target.readyState的各值意义
*
XMLHttpRequest.DONE 4 响应完成或已失败
XMLHttpRequest.LOADING 3 已收到服务器响应
XMLHttpRequest.HEADERS_RECEIVED 2 已收到服务器响应的标头
XMLHttpRequest.OPEND 1 已调用open方法
XMLHttpRequest.UNSENT 0 已创建XMLHttpRequest对象
*/ var Ajax = function(option){
this.option = {
url: null,
type: option.type == undefined ? "GET" : option.type,
async: option.async == undefined ? true : option.async,
data: option.data == undefined ? null : option.data,
contentType: option.contentType == undefined ? option.contentType : "application/x-www-form-urlencoded; charset=UTF-8",
complete: typeof(option.complete) == 'function' ? option.complete : this.defaultCompleteHandle,
success: typeof(option.success) == 'function' ? option.success : this.defaultSuccessHandle,
error:typeof(option.error) == 'function' ? option.error : this.defaultErrorHandle
},
this.createAjaxRequest = function(){
var AjaxRequest = null;// 缓存XHR对象便于 Ajax 使用
try {
// Opera 8.0+, Firefox, Safari
AjaxRequest = new XMLHttpRequest();
} catch (e) { // Internet Explorer Browsers
try {
AjaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
AjaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
// 错误处理
throw new Error("Your browser broke!");
return false;
}
}
}
return AjaxRequest;
},
this.defaultCompleteHandle = function(responseText,status,event){
console.log("[Ajax#defaultCompleteHandle] responseText:", event.target.responseText); //test
console.log("[Ajax#defaultCompleteHandle] status:", event.target.status); //test
},
this.defaultSuccessHandle = function(responseText,status,event){
console.log("[Ajax#defaultSuccessHandle] responseText:", event.target.responseText); //test
console.log("[Ajax#defaultSuccessHandle] status:", event.target.status); //test
},
this.defaultErrorHandle = function(event){
console.error("defaultErrorHandle:", "ajax request failed!");
},
(function(){
var AjaxRoot = this;//保存当前调用的根对象
var AjaxRequest = AjaxRoot.createAjaxRequest();
try{
AjaxRequest.onreadystatechange = function(event){
//      console.log("option.log:",AjaxRoot.option.log);//test if( event.target.readyState == XMLHttpRequest.DONE){// 4 响应完成或已失败  
console.log('AjaxRoot.option.complete', AjaxRoot.option.complete);
AjaxRoot.option.complete(event.target.responseText,event.target.status,event);
} else if(event.target.readyState == XMLHttpRequest.LOADING){// 3 已收到服务器响应
AjaxRoot.option.success(event.target.responseText,event.target.status,event);
}
}
AjaxRequest.open(AjaxRoot.option.type, AjaxRoot.option.url, AjaxRoot.option.async);
//ajax.open(option.method,option.url,[是否异步请求,默认为true:true],[user],[password]); console.log('AjaxRoot.option.data',AjaxRoot.option.data);//test
AjaxRequest.send(AjaxRoot.option.data);
}catch(e){
console.error(e);
AjaxRoot.option.error();
return false;
}
})();
} //Ajax Util demo
var option = {
type:"GET",
url:"http://apis.baidu.com/beijingprismcubetechnology/qmpapi/qmpproduct",
async:true,//是否异步
dataType:"json",
data:"hello",
complete:function(responseText,status,event){
console.log("complete:",responseText);
}
} Ajax(option);

三、Ajax规范设计者们所提供的接口和一些常见问题的解决方案

JavaScript之Ajax Util的更多相关文章

  1. 最新JavaScript、Ajax典藏级学习资料下载分类汇总 (2011年12月21日更新)

    其他网站开发相关资料            超强HTML和xhtml,CSS精品学习资料下载汇总                                               最新htm ...

  2. 初识JavaScript,Ajax,jQuery,并比较三者关系

    一.基本认识 1.JavaScript 定义: javaScript的简写形式就是JS,是由Netscape公司开发的一种脚本语言,一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态 ...

  3. JavaScript实现Ajax小结

    置顶文章:<纯CSS打造银色MacBook Air(完整版)> 上一篇:<TCP的三次握手和四次挥手> 作者主页:myvin 博主QQ:851399101(点击QQ和博主发起临 ...

  4. 掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求

    转http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro2/ 掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求 ...

  5. javascript版Ajax请求

    什么是Ajax请求,Ajax也就是“Asynchronous JavaScript and XML”(异步JavaScript和XML),无刷新数据读取.能减少流量的消耗,也提高了浏览的流畅性,给用户 ...

  6. Javascript与Ajax

    不使用jquery来处理ajax请求该怎么做? 首先要明确html中的某些数据需要从服务端获得,也就是客户端向服务端请求(request)数据,服务端就响应(response)这个请求,把客户端要的数 ...

  7. javascript进阶——Ajax

    统的Web 页面和应用中,用户每点击页面上的某个部分,浏览器就会向服务器发出一个请求,等待服务器做出响应,然后返回一个完整新网页,但在大多数情况下用户不得不忍受页面闪烁和长时间的等待.随着Web技术的 ...

  8. Javascript and AJAX with Yii(在yii 中使用 javascript 和ajax)

    英文原文:http://www.yiiframework.com/wiki/394/javascript-and-ajax-with-yii /*** http://www.yiiframework. ...

  9. javascript实现ajax

    什么是 ajax ajax 即“Asynchronous JavaScript and XML”(异步 JavaScript 和 XML),也就是无刷新数据读取. http 请求 首先需要了解 htt ...

随机推荐

  1. Vue+Django2.0 restframework打造前后端分离的生鲜电商项目(2)

    1.restful api介绍 1.前后端分离的优缺点 1.为什么要用前后端分离 1.pc.app.pad多端适应 2.SPA(单页面应用)开发模式开始流行 3.前后端分离职责不清 4.开发效率问题, ...

  2. redis五种数据类型的使用场景

    string 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...

  3. 斯坦福大学公开课机器学习: advice for applying machine learning | deciding what to try next(revisited)(针对高偏差、高方差问题的解决方法以及隐藏层数的选择)

    针对高偏差.高方差问题的解决方法: 1.解决高方差问题的方案:增大训练样本量.缩小特征量.增大lambda值 2.解决高偏差问题的方案:增大特征量.增加多项式特征(比如x1*x2,x1的平方等等).减 ...

  4. 第十二节、尺度不变特征(SIFT)

    上一节中,我们介绍了Harris角点检测.角点在图像旋转的情况下也可以检测到,但是如果减小(或者增加)图像的大小,可能会丢失图像的某些部分,甚至导致检测到的角点发生改变.这样的损失现象需要一种与图像比 ...

  5. Good Bye 2018 A. New Year and the Christmas Ornament

    传送门 https://www.cnblogs.com/violet-acmer/p/10201535.html 题解: 这题没什么好说的,读懂题意就会了. 比赛代码: #include<ios ...

  6. Codeforces Round #529 (Div. 3) F.Make It Connected

    传送门 题意: 有 n 个顶点,每个顶点有个花费 a[ i ],连接顶点 u,v 需要花费 a[v]+a[u]的代价. 有 m 个特殊边,每条边有三个参数 u,v,w 代表的意思是连接 u,v 的花费 ...

  7. 【清北学堂2018-刷题冲刺】Contest 2

     这场比赛的T1相当智熄.由于至今无法理解题意,我只能解出前20分.诸位dalao谁能比较好地理解题意(独立性)的,请联系我,不胜感激.  在此本蒟蒻只能贴上题面: Task 1:选举 [问题描述] ...

  8. (排序的新方法)nyoj1080-年龄排序

    1080-年龄排序 内存限制:234MB 时间限制:2000ms 特判: No通过数:148 提交数:575 难度:0 题目描述: JXB经常向HJS炫耀他们家乡那里有多么多么好,但是HJS大牛从来对 ...

  9. qml: 打包 和 发布

    Qt 提供了打包工具windeployqt, 利用该工具可以很方便的解决qt的依赖问题(注:通过实际验证,发现该工具只能解决大部分的依赖问题,不知道是不是本人 没有正确的使用的问题). qt源码编译r ...

  10. Vue computed属性

    computed vs methods 我们可以使用Vue中的method计算出学科的总分,最终得到的总数结果是相同的. 在上例的基础上,我们把computed区块中的totalMarks函数整体移到 ...