文件名:jsrpc.class.js
/** * JavaScript RPC Client * @class JsRPC * @author xie sheng tao <xie.s.t@163.com> * @date 2008-03-28 2008-04-02 2008-7-3 */ function JsRPC() // begin class { /** * JsRPC类实例自身(this) * @access private * @var object self */ var self = this; /** * Ajax执行方式,true-异步方式; false-同步方式 * @access public * @var boolean async */ this.async = true; /** * 是否开启调试模式 * @access public * @var boolean isDebug */ this.isDebug = true; /** * 使用Ajax请求执行服务端的函数,并将函数的返回值传递给客户端的回调函数的参数。 * @access public * @param string serverUrl 服务端函数所在文件的url * @param string serverFunc 服务端函数名 * @param string funcArgumentList 服务端函数的参数列表,至少一个参数。(可改为没有参数) * @return null */ this.call = function(){ var serverUrl = arguments[0];//判断是否为文件名 var serverFunc = arguments[1];//判断是否为函数名 var responseFunc = arguments[2];//判断是否为函数名 //组织表单数据 var postDate = ''; var param = getParameter(arguments); if(param == ''){ postDate ='funcName='+serverFunc; }else{ postDate ='funcName='+serverFunc+'¶meter='+param; } //创建XMLHTTP对象,设置为用POST方式发送表单数据 var xmlhttp = document.all ? new ActiveXObject('Msxml2.XMLHTTP') : new XMLHttpRequest(); xmlhttp.open('POST', serverUrl, self.async); xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // 等待Server响应,并呼叫回调函数 xmlhttp.onreadystatechange = function(){ if(xmlhttp.readyState == 4 && xmlhttp.status == 200){ if(!responseFunc) return; var data = xmlhttp.responseText.split("/n"); var status = data[0]; var content = ''; for(var i=1; i < data.length; i++){ content += data[i]; } //函数执行错误,或Ajax Server有输出 if(status == 'SERVER_ERROR'){ if(self.isDebug){ alert('SERVER_ERROR:/n'+content); } } //函数执行成功 if(status == 'SERVER_OK'){ try{ eval('responseFunc('+unescape(content)+');'); }catch(ex){ if(content != '(null)' && self.isDebug){ showError(ex, postDate); } } } } }; // 发送数据 xmlhttp.send(postDate); }; // end function call /** * 显示错误信息 * @param object ex 错误对象 * @return string src 错误来源,即要发送的表单数据 */ function showError(ex, src) { errorInfo = 'Error:/n' +'Number:'+ex.number+'/n' +'Description:'+ex.message+'/n' +'Source:'+unescape(src); alert(errorInfo); } /** * 获取调用函数及其参数的PHP代码 * 将JS脚本中的变量作为PHP脚本中函数的参数 * @param array arguments 函数的参数列表 * @return string */ function getParameter(args) { var paramSerial = ''; var count = args.length-1; for(var i=3; i <= count; i++){ paramSerial += js2PhpSerialize(args[i]) + (i < count ? ',' : ''); } return paramSerial; } /** * 将JavaScript变量转成Php变量的序列化脚本 * @param JSON, array,number,string jsVar * @return string */ function js2PhpSerialize(jsVar) { //处理特殊数据类型 if(typeof(jsVar) == 'undefined') return 'null'; if(jsVar == null) return 'null'; //处理基本数据类型 if(jsVar.constructor == Boolean) return ('' + jsVar); if(jsVar.constructor == Number) return ('' + jsVar); if(jsVar.constructor == String) return ('/'' + addslashes(jsVar) + '/''); //处理复合(引用)数据类型:数组、Object对象(JSON)、Function对象 if((typeof(jsVar) == 'object') && (jsVar.constructor == Array || jsVar.constructor == Object || (('' + jsVar.constructor).substr(0, 8) == 'function'))) { var jsScript = 'array('; for(var key in jsVar){ //此处进入递归 jsScript += '/'' + key + '/'=>' + js2PhpSerialize(jsVar[key]) + ','; } jsScript += ')'; jsScript = jsScript.replace(',)', ')'); return jsScript; } //处理其它数据类型 return 'null'; } /** * 使用反斜线引用字符串 * @param string text * @return string */ function addslashes(text) { if(text){ text = text.replace(g, ''); text = text.replace(//'/g, '///''); text = escape(text); } return text; } } // end class