diff options
author | Zhiming Wang <zmwangx@gmail.com> | 2014-10-20 16:38:24 -0700 |
---|---|---|
committer | Zhiming Wang <zmwangx@gmail.com> | 2014-10-20 16:38:24 -0700 |
commit | d139da3a3277f73d7f01e4283d8dc01630a5317c (patch) | |
tree | 5a58aeb89869f09cc48543c0540a1fbd4910040e /source/javascripts/libs/jXHR.js | |
parent | c434de5977c316c8406c00bb24221fa61ca8fe88 (diff) | |
download | my_new_personal_website-d139da3a3277f73d7f01e4283d8dc01630a5317c.tar.xz my_new_personal_website-d139da3a3277f73d7f01e4283d8dc01630a5317c.zip |
initial setup
Diffstat (limited to 'source/javascripts/libs/jXHR.js')
-rw-r--r-- | source/javascripts/libs/jXHR.js | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/source/javascripts/libs/jXHR.js b/source/javascripts/libs/jXHR.js new file mode 100644 index 00000000..6775655c --- /dev/null +++ b/source/javascripts/libs/jXHR.js @@ -0,0 +1,85 @@ +// jXHR.js (JSON-P XHR) +// v0.1 (c) Kyle Simpson +// MIT License + +(function(global){ + var SETTIMEOUT = global.setTimeout, // for better compression + doc = global.document, + callback_counter = 0; + + global.jXHR = function() { + var script_url, + script_loaded, + jsonp_callback, + scriptElem, + publicAPI = null; + + function removeScript() { try { scriptElem.parentNode.removeChild(scriptElem); } catch (err) { } } + + function reset() { + script_loaded = false; + script_url = ""; + removeScript(); + scriptElem = null; + fireReadyStateChange(0); + } + + function ThrowError(msg) { + try { publicAPI.onerror.call(publicAPI,msg,script_url); } catch (err) { throw new Error(msg); } + } + + function handleScriptLoad() { + if ((this.readyState && this.readyState!=="complete" && this.readyState!=="loaded") || script_loaded) { return; } + this.onload = this.onreadystatechange = null; // prevent memory leak + script_loaded = true; + if (publicAPI.readyState !== 4) ThrowError("Script failed to load ["+script_url+"]."); + removeScript(); + } + + function fireReadyStateChange(rs,args) { + args = args || []; + publicAPI.readyState = rs; + if (typeof publicAPI.onreadystatechange === "function") publicAPI.onreadystatechange.apply(publicAPI,args); + } + + publicAPI = { + onerror:null, + onreadystatechange:null, + readyState:0, + open:function(method,url){ + reset(); + internal_callback = "cb"+(callback_counter++); + (function(icb){ + global.jXHR[icb] = function() { + try { fireReadyStateChange.call(publicAPI,4,arguments); } + catch(err) { + publicAPI.readyState = -1; + ThrowError("Script failed to run ["+script_url+"]."); + } + global.jXHR[icb] = null; + }; + })(internal_callback); + script_url = url.replace(/=\?/,"=jXHR."+internal_callback); + fireReadyStateChange(1); + }, + send:function(){ + SETTIMEOUT(function(){ + scriptElem = doc.createElement("script"); + scriptElem.setAttribute("type","text/javascript"); + scriptElem.onload = scriptElem.onreadystatechange = function(){handleScriptLoad.call(scriptElem);}; + scriptElem.setAttribute("src",script_url); + doc.getElementsByTagName("head")[0].appendChild(scriptElem); + },0); + fireReadyStateChange(2); + }, + setRequestHeader:function(){}, // noop + getResponseHeader:function(){return "";}, // basically noop + getAllResponseHeaders:function(){return [];} // ditto + }; + + reset(); + + return publicAPI; + }; +})(window); + |