设计模式知识连载(21)---代理模式:

<body>

<h3>设计模式知识连载(21)---代理模式:</h3>
<p>
    由于一个对象不能直接引用另外一个对象,所以需要通过代理对象在这两个对象之间起到中介作用。
    【暂无细究,用到再琢磨】
</p>

<script type="text/javascript">

    /**
    *   案例一:站长统计,方式一:初始
    */
    //统计代理
    var Count = (function () {
        // 缓存图片
        var img = new Image() ;

        // 返回统计函数
        return function(param) {
            // 统计请求字符串
            var str = 'htpp://www.count.com/a.gif' ;

            // 拼接请求字符串
            for(var i in param) {
                str += i + '=' + param[i] ;
            } ;

            // 发送统计请求
            _img.src = str ;
        }
    })() ;
    // 测试用例,统计num
    Count({num : 10}) ;


    /**
    *   案例二:JSONP,方式一:初始
    */
    // 前端浏览器页面
    <s-c-r-i-p-t type = 'text/javascript'>
        //回调函数,打印出请求数据与响应数据
        function jsonpCallBack(req, res) {
            console.log(req, res) ;
        }
    </s-c-r-i-p-t>
    <s-c-r-i-p-t type="text/javascript" src = 'http://localhost/test/jsonp.php?callback=jsonpCallBack&data=getJsonpData'></s-c-r-i-p-t>

    // 另外一个域下服务器请求接口
    <?php
        /*后端获取请求字段数据,并生成返回内容*/
        $data = $_GET['data'] ;
        $callback = $_GET['callback'] ;
        echo $callback.'("success","'.$data.'")' ;
    ?>


    /**
    *   案例三:代理模板,方式一:初始
    */
    // X域中被代理页面A
    <s-c-r-i-p-t type = 'text/javascript'>
        function callback(data) {
            console.log('成功接收数据:', data) ;
        } ;
    </s-c-r-i-p-t>
    <iframe name = 'proxyIframe' id = 'proxyIframe' src = ''></iframe>
    <form action = 'http://localhost/test/proxy.php' method = 'post' 
    target='proxyIframe'>
        <input type = 'text' name = 'callback' value = 'callback'>
        <input type = 'text' name = 'proxy' value = 'http://localhost:8080/proxy.html'>
        <input type = 'submit' value = '提交'>
    </form> 

    // X域中被代理页面B
    <s-c-r-i-p-t type = 'text/javascript'>
        // 页面加载后执行
        window.onload = function() {
            // 如果不在A页面中返回,不执行
            if(top == self) {
                return ;
            } ;

            // 获取并解析searcher中的数据
            var arr = localhost.search.substr(1).split('&') ;
            var fn ;
            var args ;

            // 预定义函数名称以及参数集
            for(var i = 0, len = arr.length, item; i < len; i++) {
                // 解析searcher中的每组数据
                item = arr[i].split('=') ;
                // 判断是否为回调函数
                if(item[0] == 'callback') {
                    // 设置回调函数
                    fn = item[1] ;
                // 判断是否是参数集
                }else if(item[0] == 'arg') {
                    // 设置参数集
                    args = item[1];
                }
            } ;
            try{
                // 执行A页面中预设的回调函数
                eval('top.' + fn + '("'+ args +'")') ;
            }catch(e) {} 
        }
    </s-c-r-i-p-t>

    // Y域中被请求的接口文件C
    <?php
        $proxy = $_POST['proxy'] ;
        $callback = $_POST['callback'] ;
        header('Location:'.$proxy.'?callback='.$callback.'&arg=success') ;
    ?>
</script>   

</body>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值