Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器


Posted in Javascript onFebruary 24, 2011
Easy.Ajax = { 
proxyPool: { 
length: function () { 
var i = 0; 
for (var p in this) 
i++; 
return i - 1; 
} 
}, 
index: 0, 
async: true, 
xmlData: false, 
timeout: 1, 
defaultHeader: 'application/json; charset=utf-8', 
clearCache: true, 
emptyFn: function () { 
}, 
defaultHandlers: { 
empty: function () { }, 
onerror: this.empty, 
onload: this.empty, 
ontimeout: this.empty, 
onprogress: this.empty 
}, 
createXhr: function (id) { 
var py, pxy; 
try { 
var md = ["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"]; 
try { 
pxy = new XMLHttpRequest(); 
} catch (e) { 
} 
if (!pxy && window.XDomainRequest) 
pxy = new XDomainRequest(); 
for (var i = 0; !pxy; i++) 
try { 
pxy = new ActiveXObject(md[i]); 
} catch (e) { 
} 
py = { 
conn: pxy, 
isLoading: false, 
id: id 
}; 
this.proxyPool[id] = py; 
} catch (e) { 
return new Easy.Error(e, e.message); 
} finally { 
return pxy ? py : new Easy.Error('Null pointer'); 
} 
}, 
setEvents: function (pxy, cfg, override) { 
try { 
var dh = this.defaultHandlers, props = cfg, conn = pxy.conn, me = this; 
for (var p in dh) { 
if (!override && conn.hasOwnProperty(p)) 
continue; 
try { 
conn[p] = props[p] || dh[p]; 
} catch (e) { 
} 
} 
conn.onreadystatechange = function () { 
if (conn.readyState == 4) { 
pxy.isLoading = false; 
(cfg.callback || me.callback).call(conn, conn.responseText 
|| conn.responseXML.xml, cfg); 
me.destroy(pxy.id); 
} 
} 
} catch (e) { 
} finally { 
return conn; 
} 
}, 
callback: function (rsp, cfg) { 
var emptyFn = function () { 
}; 
if (this.status == 200) { 
(cfg.success || emptyFn).call(this, rsp); 
} else { 
(cfg.failure || emptyFn).call(this, rsp, this.statue); 
} 
}, 
getParam: function (pms) { 
return Easy.util.join(pms, "&"); 
}, 
open: function (method, url, async, cfg, uname, pwd) { 
var me = this, pxy = this.createXhr(this.index++); 
var conn = pxy.conn; 
conn.open(method, url, async); 
conn.setRequestHeader("Content-Type", cfg.xmlData || this.xmlData 
? "text/xml" 
: this.defaultHeader); 
conn.setRequestHeader("timeout", this.timeout); 
return pxy; 
}, 
toRequstCfg: function (cfg) { 
if (Easy.getType(cfg) == "string") 
cfg = { 
url: cfg 
}; 
cfg.url = Easy.util.urlAppend(cfg.url, Math.random(5)) 
var form = Easy.DOM.get(cfg.form); 
if (form) { 
if (cfg.isUpload || /multipart\/form-data/i.test(form.getAttribute("enctype"))) 
cfg.isUpload = true; 
else 
cfg.params = Easy.util.serializeForm(form); 
} 
return cfg; 
}, 
request: function (cfg, method) { 
var pxy = this.open(method || "POST", cfg.url, true, cfg), proxy = pxy.conn; 
proxy = this.setEvents(pxy, cfg, true); 
var params = this.getParam(cfg.params), bl = cfg.beforeLoad; 
if (bl && Easy.getType(bl) == "function" && bl.call(proxy) === false) 
return; 
proxy.send(params); 
pxy.isLoading = true; 
return pxy.id; 
}, 
get: function (cfg) { 
cfg = this.toRequstCfg(cfg); 
if (cfg.isUpload) 
return this.upload(cfg); 
return this.request(cfg, "GET"); 
}, 
post: function (cfg) { 
cfg = this.toRequstCfg(cfg); 
if (cfg.isUpload) 
return this.upload(cfg); 
return this.request(cfg); 
}, 
upload: function (cfg) { 
var form = Easy.DOM.get(cfg.form); 
var iframe = document.createElement("iframe"); 
var iframeID = "Easy_Ajax_Form_Submit"; 
Easy.DOM.setAttributes(iframe, { 
id: iframeID, 
name: iframeID, 
width: "0px", 
height: "0px", 
style: "display:none;", 
src: "about:blank" 
}); 
Easy.DOM.render(iframe, form); 
if (Easy.util.isIE) 
document.frames[iframeID].name = iframeID; 
var complete = function () { 
Easy.DOM.destroy(iframe); 
}; 
cfg.url = cfg.url || form.action; 
Easy.DOM.setAttributes(form, { 
action: Easy.util.urlAppend(cfg.url, cfg.params), 
target: iframeID, 
enctype: "multipart/form-data", 
method: "POST" 
}); 
var cb = function () { 
try { 
var me = this, r = 
{ 
responseText: '', responseXML: null 
}, 
doc, 
firstChild; 
try { 
doc = iframe.contentWindow.document || iframe.contentDocument || window.frames[id].document; 
if (doc) { 
if (doc.body) { 
if (/textarea/i.test((firstChild = doc.body.firstChild || {}).tagName)) { 
r.responseText = firstChild.value; 
} 
else { 
r.responseText = doc.body.innerHTML; 
} 
} 
r.responseXML = r.responseText; 
} 
} 
catch (e) { 
} 
(cfg.callback || cfg.success || complete).call(r, r.responseText || 
r.responseXML.xml, cfg); 
} catch (e) { 
(cfg.failure || cfg.callback || complete).call(r, e.message, cfg); 
} 
}; 
Easy.DOM.on(iframe, "load", cb, iframe); 
form.submit(); 
}, 
destroy: function (id) { 
this.abort(id); 
delete this.proxyPool[id]; 
}, 
abort: function (id) { 
if (!Easy.util.isIE6) 
(((this.proxyPool[id] || {}).conn.abort) || this.emptyFn)(); 
} 
};
Javascript 相关文章推荐
Tab页界面,用jQuery及Ajax技术实现
Sep 21 Javascript
document.createElement()用法
Mar 13 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
Feb 15 Javascript
完全深入学习Bootstrap表单
Nov 28 Javascript
vuejs父子组件通信的问题
Jan 11 Javascript
Node.js中看JavaScript的引用
Apr 22 Javascript
Angular-UI Bootstrap组件实现警报功能
Jul 16 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
Apr 25 Javascript
JS继承定义与使用方法简单示例
Feb 19 Javascript
Vue-cli打包后如何本地查看的操作
Sep 02 Javascript
js实现点击烟花特效
Oct 14 Javascript
Vue获取微博授权URL代码实例
Nov 04 Javascript
dojo随手记 gird组件引用
Feb 24 #Javascript
浏览器常用高宽的jquery插件
Feb 24 #Javascript
基于jquery的横向滚动条(滑动条)
Feb 24 #Javascript
基于JQuery的日期联动实现代码
Feb 24 #Javascript
jQuery boxy弹出层插件中文演示及使用讲解
Feb 24 #Javascript
jquery的键盘事件修改代码
Feb 24 #Javascript
Javascript公共脚本库系列(一): 弹出层脚本
Feb 24 #Javascript
You might like
spl_autoload_register与autoload的区别详解
2013/06/03 PHP
yii上传文件或图片实例
2014/04/01 PHP
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
jQuery 开天辟地入门篇一
2009/12/09 Javascript
javascript实现的DES加密示例
2013/10/30 Javascript
Jquery 获取对象的几种方式介绍
2014/01/17 Javascript
按钮接受回车事件的三种实现方法
2014/06/06 Javascript
详解WordPress开发中get_current_screen()函数的使用
2016/01/11 Javascript
JS未跨域操作iframe里的DOM
2016/06/01 Javascript
jQuery插件zTree实现获取一级节点数据的方法
2017/03/08 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
2017/03/25 Javascript
JS验证码实现代码
2017/09/14 Javascript
详解redis在nodejs中的应用
2018/05/02 NodeJs
页面点击小红心js实现代码
2018/05/26 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
使用gulp构建前端自动化的方法示例
2018/12/25 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
Python内置函数—vars的具体使用方法
2017/12/04 Python
Python简单生成随机数的方法示例
2018/03/31 Python
在python中将字符串转为json对象并取值的方法
2018/12/31 Python
Pycharm 安装 idea VIM插件的图文教程详解
2020/02/21 Python
python实现低通滤波器代码
2020/02/26 Python
python小白切忌乱用表达式
2020/05/29 Python
python中xlutils库用法浅析
2020/12/29 Python
小女主人连衣裙:Little Mistress
2017/07/10 全球购物
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
丑小鸭教学反思
2014/02/03 职场文书
团代会宣传工作方案
2014/05/08 职场文书
水利水电建筑施工应届生求职信
2014/07/04 职场文书
领导干部遵守党的政治纪律情况思想汇报
2014/09/14 职场文书
2014年外贸业务员工作总结
2014/12/11 职场文书
行为规范主题班会
2015/08/13 职场文书
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL
微信小程序调用python模型
2022/04/21 Python