下面是Easy.Ajax类的初稿,如须发表,在代码上还要修改以达到最简,但API是不会变了,
Easy.Ajax = (function (WINDOW) { ajax = { proxyPool: { length: function () { var i = 0; for (var p in this) i++; return i - 1; } }, index: 0, clearCache: true, contentType: "application/x-www-form-urlencoded; charset=utf-8", timeout: 10000, async: true, xmlData: false, createXhr: function (id) { var py, pxy; try { try { pxy = new XMLHttpRequest(); } catch (e) { } var md = ['Msxml2.XMLHTTP.4.0', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP']; for (var i = 0; !pxy && i < md.length; 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'); } }, getParam: function (pms) { return Easy.util.join(pms, "&"); }, callback: function (rsp, cfg) { if (this.status == 200) { (cfg.success || Easy.emptyFn).call(this, rsp); } else { (cfg.failure || Easy.emptyFn).call(this, rsp, this.statue); } }, 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, uname, pwd); conn.setRequestHeader("Content-Type", cfg.xmlData || this.xmlData ? "text/xml" : this.contentType); conn.setRequestHeader("timeout", cfg.timeout || this.timeout); try { conn.setRequestHeader("X-Requested-With", "XMLHttpRequest"); } catch (e) { } try { conn.onreadystatechange = function () { if (conn.readyState == 4) { pxy.isLoading = false; (cfg.callback || me.callback).call(conn, conn.responseText || conn.responseXML, cfg); Easy.delay(me.destroy, 10, pxy, pxy.id); } } conn.ontimeout = cfg.ontimeout || dh.ontimeout; } catch (e) { } return pxy; }, toRequstCfg: function (cfg) { if (Easy.isstring(cfg)) 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) { if (cfg.isupload && cfg.form) return this.upload(cfg); var pxy = this.open(method || "POST", cfg.url, true, cfg), proxy = pxy.conn; 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); return this.request(cfg, "GET"); }, post: function (cfg) { cfg = this.toRequstCfg(cfg); return this.request(cfg); }, upload: function (cfg) { if (!form) { form = Easy.DOM.create({ tag: 'form', id: "Easy_Ajax_Form" }, Easy.getBody()); formCreated = true; } 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.isIE6 || Easy.isIE7) document.frames[iframeID].name = iframeID; var complete = function () { Easy.DOM.destroy(iframe); if (formCreated) Easy.DOM.destroy(form); }; cfg.url = cfg.url || form.action; Easy.DOM.setAttributes(form, { action: Easy.util.urlAppend(cfg.url, cfg.params), target: iframeID, enctype: "multipart/form-data", encoding : "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, 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) { var ajax = Easy.Ajax ajax.abort.call(ajax, id); delete ajax.proxyPool[id]; }, abort: function (id) { if (!Easy.isIE6) try { (this.proxyPool[id] || { conn: {} }).conn.abort(); } catch (e) { } } } return ajax;})(window);
转载于:https://www.cnblogs.com/Easyjs/archive/2011/02/24/ajax.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。