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