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 添加千分位与去掉千分位的示例
Jul 11 Javascript
jQuery中replaceAll()方法用法实例
Jan 16 Javascript
编写自己的jQuery提示框(Tip)插件
Feb 05 Javascript
js Canvas绘制圆形时钟效果
Feb 17 Javascript
微信小程序实现瀑布流布局与无限加载的方法详解
May 12 Javascript
Angular2使用Angular CLI快速搭建工程(一)
May 21 Javascript
了解ESlint和其相关操作小结
May 21 Javascript
详解javascript中的babel到底是什么
Jun 21 Javascript
Vue中的异步组件函数实现代码
Jul 20 Javascript
vue路由跳转传参数的方法
May 06 Javascript
详解Vue中的watch和computed
Nov 09 Javascript
低门槛开发iOS、Android、小程序应用的前端框架详解
Oct 16 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脚本
2006/11/26 PHP
在PHP中使用与Perl兼容的正则表达式
2006/11/26 PHP
Smarty+QUICKFORM小小演示
2007/02/25 PHP
用PHP实现Ftp用户的在线管理的代码
2007/03/06 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
PHP实现读取文件夹及批量重命名文件操作示例
2019/04/15 PHP
laravel返回统一格式错误码问题
2019/11/04 PHP
JavaScript prototype对象的属性说明
2010/03/13 Javascript
浅谈Javascript嵌套函数及闭包
2010/11/09 Javascript
浅谈Javascript 执行顺序
2013/12/18 Javascript
JS的数组迭代方法
2015/02/05 Javascript
再谈javascript注入 黑客必备!
2016/09/14 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
浅谈JS对象添加getter与setter的5种方法
2018/06/09 Javascript
详解js加减乘除精确计算
2019/03/19 Javascript
微信小程序云开发之使用云存储
2019/05/17 Javascript
JS实现手写 forEach算法示例
2020/04/29 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
详解python 发送邮件实例代码
2016/12/22 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
Python 70行代码实现简单算式计算器解析
2019/08/30 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
Python+unittest+requests 接口自动化测试框架搭建教程
2020/10/09 Python
python 提高开发效率的5个小技巧
2020/10/19 Python
AmazeUI折叠式卡片布局,整合内容列表、表格组件实现
2020/08/20 HTML / CSS
本科毕业生专业自荐书范文
2014/02/05 职场文书
法人委托书
2014/07/31 职场文书
学校运动会报道稿
2014/09/23 职场文书
2015年党员承诺书
2015/01/21 职场文书
自主招生自荐信格式范文
2015/03/25 职场文书
2016消防宣传标语口号
2015/12/26 职场文书
浅析CSS在DevTools 中架构演变
2021/10/05 HTML / CSS
Python之matplotlib绘制饼图
2022/04/13 Python