12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- // 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);
|