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

 更新时间:2011年02月24日 23:57:49   作者:  
下面是Easy.Ajax类的初稿,如须发表,在代码上还要修改以达到最简,但API是不会变了
复制代码 代码如下:

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)();
}
};

相关文章

  • uni-app动态修改主题色的方法详解

    uni-app动态修改主题色的方法详解

    最近在看uniapp开发app时需要实现动态修改主题色的功能,这篇文章主要给大家介绍了关于uni-app动态修改主题色的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • js实现拉幕效果的广告代码

    js实现拉幕效果的广告代码

    这篇文章主要介绍了js实现拉幕效果的广告代码,涉及javascript定时操作页面元素属性变换的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • 原生javascript自定义input[type=radio]效果示例

    原生javascript自定义input[type=radio]效果示例

    这篇文章主要介绍了原生javascript自定义input[type=radio]效果,结合实例形式分析了javascript模拟form表单中radio效果的相关操作技巧,需要的朋友可以参考下
    2019-08-08
  • JavaScript模板引擎应用场景及实现原理详解

    JavaScript模板引擎应用场景及实现原理详解

    这篇文章主要介绍了JavaScript模板引擎应用场景及实现原理,结合实例形式详细分析了javascript模版引擎的具体应用场景、实现原理、相关操作技巧与注意事项,需要的朋友可以参考下
    2018-12-12
  • js实现点击弹窗弹出登录框

    js实现点击弹窗弹出登录框

    这篇文章主要为大家详细介绍了js实现点击弹窗弹出登录框,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • Bootstrap3 图片(响应式图片&图片形状)

    Bootstrap3 图片(响应式图片&图片形状)

    这篇文章主要介绍了 Bootstrap3 图片 响应式图片和图片形状的相关资料,需非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-01-01
  • JavaScript实现商品放大镜效果

    JavaScript实现商品放大镜效果

    这篇文章主要为大家详细介绍了JavaScript实现商品放大镜效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • js点击列表文字对应该行显示背景颜色的实现代码

    js点击列表文字对应该行显示背景颜色的实现代码

    这篇文章主要介绍了js点击列表文字对应该行显示背景颜色的实现代码,感兴趣的小伙伴可以参考下
    2015-08-08
  • JavaScript 生成随机数并自动大小排序

    JavaScript 生成随机数并自动大小排序

    JavaScript按规定生成随机数,并按指定顺序自动排序,本例中将生成1——100以内的随机数,并按照由小到大的顺序排列起来。
    2009-12-12
  • 微信小程序如何获取openid及用户信息

    微信小程序如何获取openid及用户信息

    这篇文章主要介绍了微信小程序如何获取openid及用户信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01

最新评论