ajax的再次封装!(改进版) —— new与不 new 有啥区别?
生命不息重构不止!
上一篇写了一下我对ajax的再次封装的方法,收到了很多有价值的回复,比如有童鞋建议用$.extend,一开始还以为要做成插件呢,后来才知道,原来这个东东还可以实现合并。省着自己再去做判断了。
还有童鞋说“要不要多加点传入参数”,这一下提醒我了,ajax有很多参数呀,常用的我考虑进来了,但是还有很多不常用的呢,如果需要的话怎么办?在看看我调用原生ajax的方式,kao,完全不支持增加其他参数吗,这怎么行,改一定要改。于是就改成了这样。
//对ajax的封装 //最基础的一层封装
Nature.Ajax = function(ajaxInfo) { //定义默认值
//type: "GET", //访问方式:如果dataPata不为空,自动设置为POST;如果为空设置为GET。
//dataType: Nature.AjaxConfig.ajaxDataType, //数据类型:JSON、JSONP、text
//cache: true, //是否缓存,默认缓存
//urlPara: {},//url后面的参数。一定会加在url后面,不会加到form里。
//formData: {},//表单里的参数。如果dataType是JSON,一定加在form里,不会加在url后面;如果dataType是JSONP的话,只能加在url后面。
//url: //依靠上层指定 //补全ajaxInfo
//dataType
if (typeof ajaxInfo.dataType == "undefined") ajaxInfo.dataType = Nature.AjaxConfig.ajaxDataType;
//cache
if (typeof ajaxInfo.cache == "undefined") ajaxInfo.cache = false; //type
if (typeof ajaxInfo.formData == "undefined") {
ajaxInfo.type = "GET";
} else {
ajaxInfo.type = "POST";
ajaxInfo.data = ajaxInfo.formData;
} //处理URL和参数
if (typeof ajaxInfo.urlPara != "undefined") {
var tmpUrlPara = "";
var para = ajaxInfo.urlPara;
for (var key in para) {
tmpUrlPara += "&" + key + "=" + para[key];
} if (ajaxInfo.url.indexOf('?') >= 0) {
//原地址有参数,直接加
ajaxInfo.url += tmpUrlPara;
} else {
//原地址没有参数,变成?再加
ajaxInfo.url += tmpUrlPara.replace('&', '?');
}
} //处理xhrFields
if (typeof ajaxInfo.xhrFields == "undefined") {
ajaxInfo.xhrFields = {
//允许cors跨域访问时添加cookie
withCredentials: true
};
} else {
if (typeof ajaxInfo.xhrFields.withCredentials == "undefined") {
ajaxInfo.xhrFields.withCredentials = true;
}
} //处理error
var error = ajaxInfo.error;
ajaxInfo.error = function(request, textStatus, errorThrown) {
//访问失败,自动停止加载动画,并且给出提示
alert("提交" + ajaxInfo.title + "的时候发生错误!");
if (typeof top.spinStop != "undefined")
top.spinStop();
if (typeof error == "function") error();
}; //处理success
var success = ajaxInfo.success;
ajaxInfo.success = function(data) {
//显示调试信息
if (typeof(parent.DebugSet) != "undefined")
parent.DebugSet(data.debug); if (typeof(ajaxInfo.ctrlId) == "undefined")
success(data);
else {
success(ajaxInfo.ctrlId, data);
}
}; //开始执行ajax
$.ajax(ajaxInfo);
};
虽然还是只有一个参数,但是这个参数是一个集合。可以包含很多的元素(属性)。改进后完全以这个参数为主,进行默认的属性设置,最后直接把这个参数传递给原生ajax,这样调用的时候,可以根据ajax的规则来设定自己需要的属性了。
另外去掉了 defaultInfo。因为看来看去,就是一个Nature.sendDataType 算是默认值,其他的都不算了。所以干脆去掉吧。改进后既可以很方便的调用,也确保了其扩展性,可以增加其他的属性。
var ajax = Nature.Ajax;
ajax({
url:"",
formData: jsonValue,
urlPara: ajaxUrlPara,
title: "保存数据",
success: function(data) {
if (data.err.length == 0) {
alert("保存成功!");
//清空表单
} else {
alert(data.err);
}
if (typeof callback == "function") {
callback();
}
}
});
好像还是要写不少东东,但是仔细看看的话,可以发现有很多优势,首先明确了哪些参数用url传递,哪些参数用表单post传递。error有了统一的处理,苏测试时success了也可以统一显示调试信息。不用去考虑是post还是get是json还是jsonp,这些都会统一处理。
最后涉及到了一个并发的问题,因为我想实现“复用”,这个函数会被加载到top页面里,其他的子页面都会到top里调用这个函数,那么如果同时打开两个iframe,一起加载,并发了怎么办?会不会产生冲突?如果new的话,并发的时候肯定不会产生冲突,但是jQuery的ajax似乎没有new,那么他是如何处理并发的呢?
我是实践派,遇到问题了首先想到的是写点代码测试一下,然后再去找找原理和理论。于是我就写了个代码模拟测试一下,看看并发的情况。
var state = 1;
function fun1(para, timestep) {
var temp = para.a1;//内部变量
para.a1 = para.a1 * 100;//修改参数看看
this.time = timestep;//这个不new的时候能用吗?
var self = this;//setTimeout里面用不了这个this,那么江湖规矩。
state ++;//全局变量,不解释
window.setTimeout(function() { //模拟回调
console.log(para.name);
console.log("para.a1 : " + para.a1);
console.log("temp:" + temp);
console.log("this.time: " + self.time);
},timestep);
}
fun1({ name: "aa1",a1:10 }, 1000);
fun1({ name: "aa2", a1: 20 }, 100);
var f1 = new fun1({ name: "aa3", a1: 30 }, 10);
大家猜猜输出结果是啥?
ajax的再次封装!(改进版) —— new与不 new 有啥区别?的更多相关文章
- ajax的再次封装!
js的动态加载.缓存.更新以及复用 系列有点卡文,放心会继续的.先来点更基础的,为js的加载做点铺垫. jQuery的ajax本来就很方便了,为啥还要在进一步的封装呢?这个首先要看项目的具体需求了,如 ...
- jquery ajax的再次封装,简化操作
1.封装的ajax var funUrl="" // 每个请求地址相同的部分 function queryData(url,params,success,error){ url ...
- JS弹出框插件zDialog再次封装
zDialog插件网址:http://www.jq22.com/jquery-info2426 再次封装zDialog的代码: (function ($) { $.extend({ iDialog: ...
- easyui的window插件再次封装
easyui的window插件再次封装 说明:该插件弹出的弹出框在最顶层的页面中,而不是在当前页面所在的iframe中,它的可拖动范围是整个浏览器窗口:所以不能用JS的parent对象获取弹出它的父页 ...
- Ajax基础之封装3
今天接着我们上篇博文的栗子,现在我来扩大一下需求,之前是点击按钮取出新闻,现在要实现每隔一段事件进行新闻的更新.这个时候,肯定是加一个定时器,然后每隔一段事件,再进行一次Ajax请求,既然要经常用到A ...
- javascript笔记——jqGrid再次封装
xingrunzhao js插件再次封装 demo 'use strict'; /** * commerce grid框架 * 依赖jqgrid */ (function ($_self, jQuer ...
- jQuery Ajax 二次封装
jQuery Ajax通用js封装 第一步:引入jQuery库 <script type="text/javascript" src="<%=path%> ...
- ajax二次封装之异步加载
ajax二次封装之异步加载 ajax异步加载会导致在数据未加载回来就读取数据,然后出现数据为空的报错.在ajax封装时,将ajax直接改为同步,虽然可以解决报错,但是会导致页面渲染被阻塞,接口反应时间 ...
- 微信小程序request(ajax)接口请求封装
微信小程序request(ajax)接口请求封装 最近在进行小程序的编写,需要调用后端接口,经常要用到wx.request方法,所以就自己封装了一下,简化一下代码,如果能给大家提供帮助更好,在封装的时 ...
随机推荐
- Linux快速入门04-扩展知识
这部分是快速学习的最后一部分知识,其中最重要的内容就是源码的打包和软件的安装的学习,由于个人的Linux学习目的就是自己能在阿里云Ubuntu上搭建一个简单的nodejs发布环境. Linux系列文章 ...
- JavaScript与有限状态机
有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物. 简单说,它有三个特征: * 状态总数(state)是有限的. * 任一时刻,只处在一种状态之中. ...
- 如何安装Oracle Instant Client
Oracle Instant Client是Oracle发布的轻量级数据库客户端,下面我们来看看官方的定义: Instant Client allows you to run your applica ...
- 拓扑排序(三)之 Java详解
前面分别介绍了拓扑排序的C和C++实现,本文通过Java实现拓扑排序. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑排序的代码说明 4. 拓扑排序的完整源码和测试程序 转载请注明出处 ...
- [转载]Office Visio快捷键
“帮助”任务窗格和“帮助”窗口 使用“帮助”任务窗格和“帮助”窗口 通过“帮助”任务窗格,您可以访问“Microsoft Office Visio 帮助”的全部内容,该窗格显示为 Microsoft ...
- [Node.js] Node.js项目的持续集成
原文地址:http://www.moye.me/2016/03/03/nodejs_ci_by_jenkins 引子 持续集成 (Continuous Integration,简称CI)是一种软件工程 ...
- iHover – 30+ 纯 CSS 实现的超炫的图片悬停特效
iHover 是一个令人印象深刻的图片悬停效果集合,完全基于 CSS3 实现,无依赖,能够搭配 Bootstrap 3 很好地工作.基于 SCSS 技术构建,便于修改变量.有模块化的代码,无需包含整个 ...
- SQL中利用DMV进行数据库性能分析
相信朋友对SQL Server性能调优相关的知识或多或少都有一些了解.虽然说现在NOSQL相关的技术非常的火热,但是RMDB(关系型数据库)与NOSQL是并存的,并且适用在各种的项目中.在一般的企业级 ...
- Windows Azure Active Directory (4) China Azure AD Self Password Reset
<Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China. 在开始本章内容之前,请读者熟悉笔者之前写的文档: Windows ...
- Halcon编程-基于纹理的mara检测
表面瑕疵检测是机器视觉领域非常重要的一个应用.机器视觉是集光学.机电和计算机三个领域的一门不算新的技术.但目前表面瑕疵检测在学界主要是计算机专业或者控制专业瞄准图像处理方向在做,而视觉光学系统这一块主 ...