Ajax handler built on XMLHttpRequest and implementation of utilities (design patterns, and other collection handling functions)
parent
c2a61d8d95
commit
c904128d48
@ -0,0 +1,162 @@
|
|||||||
|
/**
|
||||||
|
* (c) 2010 jxf - rpc module.
|
||||||
|
*
|
||||||
|
* The idea of behind this module is fetching data via an RPC-like call:
|
||||||
|
* . RESTful web services
|
||||||
|
* . XML/SOAP (not yet implemented)
|
||||||
|
* . Remote document (HTML; XML; JSON)
|
||||||
|
* . Local documents (HTML; XML; JSON)
|
||||||
|
* The module will return the data to a callback function should a parser be specified, the module will parse the data and return the parsed data to the callback function
|
||||||
|
* This allows the client code to minimize parsing should returned data be in a standard format.
|
||||||
|
* TODO:
|
||||||
|
* Improve on how returned data is handled (if necessary).
|
||||||
|
*/
|
||||||
|
if(!jx){
|
||||||
|
var jx = {}
|
||||||
|
}
|
||||||
|
//jx.ajax = {
|
||||||
|
// /**
|
||||||
|
// * In order to make the ajax requests domain specific we allow users to get an instance while making a global implementation available
|
||||||
|
// * This is useful for oauth applications that require domain specific headers to be set upon issuing a request
|
||||||
|
// */
|
||||||
|
// getInstance:function(){
|
||||||
|
// var obj = {} ;
|
||||||
|
// obj.headers = [] ;
|
||||||
|
// obj.setHeader = function(key,value){
|
||||||
|
// this.headers.push({'key':key,'value':value}) ;
|
||||||
|
// }
|
||||||
|
// obj.async = true;
|
||||||
|
// obj.send = function(url,callback,method){
|
||||||
|
// var xmlhttp = new XMLHttpRequest() ;
|
||||||
|
// method = (method==null)?'GET':method ;
|
||||||
|
// xmlhttp.onreadystatechange = function(){
|
||||||
|
// if(xmlhttp.readyState == 4){
|
||||||
|
// callback(xmlhttp) ;
|
||||||
|
// }
|
||||||
|
// }//-- end of Inline function
|
||||||
|
// var key,value ;
|
||||||
|
// //
|
||||||
|
// // async=false has been deprecated (browsers complain a lot)
|
||||||
|
// xmlhttp.open(method,url,this.async) ;
|
||||||
|
//
|
||||||
|
// if(obj.headers.length > 0){
|
||||||
|
// for(var i=0; i < obj.headers.length; i++){
|
||||||
|
// key = obj.headers[i]['key'] ;
|
||||||
|
// value= obj.headers[i]['value'];
|
||||||
|
// //air.trace(key+'='+value)
|
||||||
|
//
|
||||||
|
// if(key != null && value != null){
|
||||||
|
// xmlhttp.setRequestHeader(key,value) ;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// xmlhttp.send(null) ;
|
||||||
|
// }
|
||||||
|
// return obj;
|
||||||
|
//
|
||||||
|
// },//-- end jx.ajax.getInstance
|
||||||
|
// parser:null
|
||||||
|
// }//--end jx.ajax
|
||||||
|
|
||||||
|
/**
|
||||||
|
* These are a few parsers that can come in handy:
|
||||||
|
* urlparser: This parser is intended to break down a url parameter string in key,value pairs
|
||||||
|
*/
|
||||||
|
|
||||||
|
function urlparser(url){
|
||||||
|
if(url.toString().match(/\x3F/) != null){
|
||||||
|
url = url.split('\x3F')[1]
|
||||||
|
|
||||||
|
}
|
||||||
|
var p = url.split('&') ;
|
||||||
|
var r = {} ;
|
||||||
|
r.meta = [] ;
|
||||||
|
r.data = {} ;
|
||||||
|
var entry;
|
||||||
|
for(var i=0; i < p.length; i++){
|
||||||
|
entry = p[i] ;
|
||||||
|
key = (entry.match('(.*)=') !=null)? entry.match('(.*)=')[1]:null ;
|
||||||
|
value = (entry.match('=(.*)$') != null)? entry.match('=(.*)$')[1]:null
|
||||||
|
if(key != null){
|
||||||
|
key = key.replace('\x3F','')
|
||||||
|
r.meta.push(key) ;
|
||||||
|
r.data[key] = value ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The following are corrections related to consistency in style & cohesion
|
||||||
|
*/
|
||||||
|
jx.ajax = {}
|
||||||
|
jx.ajax.get = {} ;
|
||||||
|
jx.ajax.get.instance = jx.ajax.getInstance ;
|
||||||
|
jx.ajax.debug = null;
|
||||||
|
jx.ajax.get.instance = function(){
|
||||||
|
var factory = function(){
|
||||||
|
this.obj = {}
|
||||||
|
this.obj.headers = {}
|
||||||
|
this.obj.async = true;
|
||||||
|
this.setHeader = function(key,value){
|
||||||
|
if(key.constructor != String && value == null){
|
||||||
|
this.obj.headers = key ;
|
||||||
|
}else{
|
||||||
|
this.obj.headers[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.setData = function(data){
|
||||||
|
this.obj.data = data;
|
||||||
|
}
|
||||||
|
this.setAsync = function(flag){
|
||||||
|
this.obj.async = (flag == true) ;
|
||||||
|
}
|
||||||
|
this.send = function(url,callback,method){
|
||||||
|
|
||||||
|
if(method == null){
|
||||||
|
method = 'GET'
|
||||||
|
}
|
||||||
|
|
||||||
|
p = jx.ajax.debug != null;
|
||||||
|
q = false;
|
||||||
|
if(p){
|
||||||
|
q = jx.ajax.debug[url] != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
is_debuggable = p && q
|
||||||
|
|
||||||
|
if(is_debuggable){
|
||||||
|
x = {} ;
|
||||||
|
x.responseText = jx.ajax.debug [url] ;
|
||||||
|
callback(x)
|
||||||
|
}else{
|
||||||
|
var http = new XMLHttpRequest() ;
|
||||||
|
http.onreadystatechange = function(){
|
||||||
|
if(http.readyState == 4){
|
||||||
|
|
||||||
|
callback(http)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// In order to insure backward compatibility
|
||||||
|
// Previous versions allowed the user to set the variable on the wrapper (poor design)
|
||||||
|
if(this.async != null){
|
||||||
|
this.setAsync(this.async) ;
|
||||||
|
}
|
||||||
|
http.open(method,url,this.obj.async) ;
|
||||||
|
for(key in this.obj.headers){
|
||||||
|
value = this.obj.headers[key] ;
|
||||||
|
|
||||||
|
http.setRequestHeader(key,value)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
http.send(this.obj.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}//-- end of the factory method
|
||||||
|
return new factory() ;
|
||||||
|
}
|
Loading…
Reference in new issue