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 相关文章推荐
学习ExtJS form布局
Oct 08 Javascript
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
Apr 18 Javascript
VBS通过WMI监视注册表变动的代码
Oct 27 Javascript
JS延迟加载加快页面打开速度示例代码
Dec 30 Javascript
Javascript window对象详解
Nov 12 Javascript
Vue.js结合bootstrap实现分页控件
Mar 10 Javascript
react高阶组件经典应用之权限控制详解
Sep 07 Javascript
js隐式转换的知识实例讲解
Sep 28 Javascript
react native 原生模块桥接的简单说明小结
Feb 26 Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
May 10 jQuery
jquery使用echarts实现有向图可视化功能示例
Nov 25 jQuery
javascript设计模式 ? 状态模式原理与用法实例分析
Apr 22 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
php接口和抽象类使用示例详解
2014/03/02 PHP
zf框架db类的分页示例分享
2014/03/14 PHP
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
关于javascript中的parseInt使用技巧
2009/09/03 Javascript
javascript 面向对象继承
2009/11/26 Javascript
Prototype源码浅析 Enumerable部分之each方法
2012/01/16 Javascript
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
js改变鼠标的形状和样式的方法
2014/03/31 Javascript
基于js实现二级下拉联动
2016/12/17 Javascript
Angular2实现自定义双向绑定属性
2017/03/22 Javascript
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
Angular项目从新建、打包到nginx部署全过程记录
2017/12/09 Javascript
Vue 使用中的小技巧
2018/04/26 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
2018/08/14 Javascript
基于js实现的图片拖拽排序源码实例
2020/11/04 Javascript
[57:18]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#3VP VS VG
2016/03/03 DOTA
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
Python编程中装饰器的使用示例解析
2016/06/20 Python
Django实现全文检索的方法(支持中文)
2018/05/14 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
Tensorflow: 从checkpoint文件中读取tensor方式
2020/02/10 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
python实现逻辑回归的示例
2020/10/09 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
Python基于爬虫实现全网搜索并下载音乐
2021/02/14 Python
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
保安队长职务说明书
2014/02/23 职场文书
初级党校心得体会
2014/09/11 职场文书
乱丢垃圾袋检讨书
2014/10/08 职场文书
三潭印月的导游词
2015/02/12 职场文书
论文致谢词范文
2015/05/14 职场文书
培训班开班主持词
2015/07/02 职场文书
教师节随笔
2015/08/15 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书