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 2.0 GridPanel基本表格简明教程
May 25 Javascript
jQuery 表单验证扩展代码(一)
Oct 11 Javascript
jquery异步跨域访问代码
Jun 28 Javascript
js从Cookies里面取值的简单实现
Jun 30 Javascript
javascript学习笔记(四)function函数部分
Sep 30 Javascript
Bootstrap实现水平排列的表单
Jul 04 Javascript
前端页面文件拖拽上传模块js代码示例
May 19 Javascript
jQuery中each循环的跳出和结束实例
Aug 16 jQuery
vue.js通过路由实现经典的三栏布局实例代码
Jul 08 Javascript
JavaScript 高性能数组去重的方法
Sep 20 Javascript
Angular(5.2->6.1)升级小结
Dec 27 Javascript
小程序实现简单语音聊天的示例代码
Jul 24 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
初学者入门:细述PHP4的核心Zend
2006/09/05 PHP
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
ThinkPHP有变量的where条件分页实例
2014/11/03 PHP
phpnow php探针环境检测代码
2014/11/04 PHP
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
php微信开发之谷歌测距
2018/06/14 PHP
Gambit vs ForZe BO3 第三场 2.13
2021/03/10 DOTA
javascript-TreeView父子联动效果保持节点状态一致
2007/08/12 Javascript
JavaScript 类型的包装对象(Typed Wrappers)
2011/10/27 Javascript
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
javascript自启动函数的问题探讨
2013/10/05 Javascript
jQuery中innerHeight()方法用法实例
2015/01/19 Javascript
javascript 实现map集合
2015/04/03 Javascript
node.js下LDAP查询实例分享
2015/09/30 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
实现React单页应用的方法详解
2016/08/02 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
2018/10/08 Javascript
Layui事件监听的实现(表单和数据表格)
2019/10/17 Javascript
vue之debounce属性被移除及处理详解
2019/11/13 Javascript
vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码
2020/05/19 Javascript
Python连接mysql数据库的正确姿势
2016/02/03 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
python学生信息管理系统(完整版)
2020/04/05 Python
python爬虫之自制英汉字典
2019/06/24 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
2019/10/22 Python
Python3如何判断三角形的类型
2020/04/12 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
在线吉他课程,学习如何弹吉他:Fender Play
2019/02/28 全球购物
.NET面试题:什么是反射
2016/09/30 面试题
《泉水》教学反思
2014/04/11 职场文书
小学生迎国庆演讲稿
2014/09/05 职场文书
开票证明
2015/06/23 职场文书
javascript进阶篇深拷贝实现的四种方式
2022/07/07 Javascript