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 相关文章推荐
js绑定事件this指向发生改变的问题解决方法
Apr 23 Javascript
基于jquery和svg实现超炫酷的动画特效
Dec 09 Javascript
Javascript中的几种URL编码方法比较
Jan 23 Javascript
js实现文本框只允许输入数字并限制数字大小的方法
Aug 19 Javascript
原生js实现无缝轮播图效果
Jan 11 Javascript
微信小程序 按钮滑动的实现方法
Sep 27 Javascript
详解RequireJs官方使用教程
Oct 31 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
Sep 30 Javascript
angularjs http与后台交互的实现示例
Dec 21 Javascript
微信小程序实现拨打电话功能的示例代码
Jun 28 Javascript
js实现炫酷光感效果
Sep 05 Javascript
JS前端使用canvas实现扩展物体类和事件派发
Aug 05 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提示Notice: Undefined variable的解决办法
2012/11/24 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
php上传文件常见问题总结
2015/02/03 PHP
浅谈htmlentities 、htmlspecialchars、addslashes的使用方法
2016/12/09 PHP
解析PHP之提取多维数组指定列的方法
2017/01/03 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
Javascript实例教程(19) 使用HoTMetal(6)
2006/12/23 Javascript
jquery的$(document).ready()和onload的加载顺序
2010/05/26 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
JavaScript实现把数字转换成中文
2015/06/29 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
JS简单获取及显示当前时间的方法
2016/08/03 Javascript
jQuery事件用法详解
2016/10/06 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
2017/08/16 Javascript
bootstrap中selectpicker下拉框使用方法实例
2018/03/22 Javascript
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
webpack 如何同时输出压缩和未压缩的文件的实现步骤
2020/06/05 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
nestjs返回给前端数据格式的封装实现
2021/02/22 Javascript
Python中使用pprint函数进行格式化输出的教程
2015/04/07 Python
速记Python布尔值
2017/11/09 Python
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
Python Opencv轮廓常用操作代码实例解析
2020/09/01 Python
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
Herschel美国官网:背包、手提袋及配件
2020/03/10 全球购物
荷兰家电销售网站:Welhof
2020/12/08 全球购物
explicit和implicit的含义
2012/11/15 面试题
初中三好学生事迹材料
2014/01/13 职场文书
《记承天寺夜游》教学反思
2014/02/16 职场文书
安徽导游词
2015/02/12 职场文书
2015社区精神文明建设工作总结
2015/04/21 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
一文搞懂php的垃圾回收机制
2021/06/18 PHP