JavaScript RPC Client 源码

文件名: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值