通用跨域请求代理文件

<script type="text/javascript">
document.domain = 'test.cn';

var $ = {}; 
$.xho = function () { //创建xmlhttprequest对象 
    var http_request = null; 
    if (window.XMLHttpRequest) { //Mozilla 浏览器 
        http_request = new XMLHttpRequest(); 
        if (http_request.overrideMimeType) {//设置MIME类别 
            http_request.overrideMimeType("text/xml"); 
        } 
    } 
    else if (window.ActiveXObject) { //IE浏览器 
        try { 
            http_request = new ActiveXObject("Msxml2.XMLHTTP"); 
        } catch (e) { 
            try { 
                http_request = new ActiveXObject("Microsoft.XMLHTTP"); 
            } catch (e) { } 
        } 
    } 
    return http_request; 
};

$.rsc = function (obj, callfunc) { 
    return function () { 
        if (obj.readyState == 4) { 
            if (obj.status == 200) { 
                callfunc(obj.responseText); 
            } 
        } 
    };
};

$.GET = function (url, callfunc) { 
    var xho = $.xho(); 
    if (xho == null) return; 
    xho.onreadystatechange = $.rsc(xho, callfunc); //设置回调函数 
    //第三个参数指定在等待服务器返回信息的时间内是否继续执行下面代码,如果为true,则不会继续执行,默认为true 
    xho.open("GET", url, true); 
    xho.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    xho.send(null); 
};

$.POST = function (url, data, callfunc) {
    var xho = $.xho(); 
    if (xho == null) return; 
    xho.onreadystatechange = $.rsc(xho, callfunc); //设置回调函数 
    xho.open("POST", url, true); 
    xho.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); //post请求必须修改MIME类别 
    xho.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    xho.send(data); 
};

function call(func, param)
{
    func = eval('parent.window.' + func);
    func(param);
}


function isJson(obj){
    var isjson = typeof(obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length;    
    return isjson;
}

function isEmpty(obj) {
    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            return false;
    }
    return true;
}

function json2Query(params) {
    tail = [];
    for (var p in params) {
        if (params.hasOwnProperty(p)) {
            tail.push(p + "=" + encodeURIComponent(params[p]));
        }
    }
    return tail.join("&")
}

var invokeApi = function(api, param, method, callback) {
    var m = (!method || method.toLowerCase() == 'get') ? 'get' : 'post';
    if ('get' == m) {
        debugger
        if (isJson(param) && ! isEmpty(param)) {
            param = json2Query(param);
        }

        if (param) {
            api = (api.indexOf('?') == -1) ? api + '?' + param : api  + '&' + param;
        }


        $.GET(
            api,
            function(data){
                call(callback, data);
            }
        )
    } else {
        if (isJson(param)) {
            param = json2Query(param);
        }
        $.POST(
            api,
            param,
            function(data) {
                call(callback, data);
            }
        )
    }
}

</script>

 说明:比如 a.test.cn的js想发送请求到 b.test.cn,这时只需要在 b.test.cn 的根目录新增一个 proxy.html ,内容为上面的代码。然后在 a.test.cn 下新建一个html文件,内容如下:

<script type="text/javascript">

mod = {};

mod.submod = function() {

    var ifr_win = '';

    var init = function() {
        load_iframe();
    }

    var load_iframe = function() {
            document.domain = 'test.cn';
            var ifr = document.createElement('iframe');
            ifr.src = 'http://b.test.cn/proxy.html';
            ifr.style.display = 'none';
            ifr.id = 'proxy_ifr';
            document.body.appendChild(ifr);
            ifr.onload = function() {
                ifr_win = ifr.contentWindow;
            };
    };

    var cb = function(msg) {
        console.log(msg);
    }

    var get_dl = function() {
        ifr_win.invokeApi(
            'http://b.test.cn/ajax/dl',
            {"id":13082, "from":"office", "app":"helper", "file_type":1},
            'POST',
            'mod.submod.cb'
        );
    }

    var get_preview = function() {
        ifr_win.invokeApi(
            'http://b.test.cn/ajax/preview',
            {"mb_id":12269, "moban_type":"2", "app":"helper", "file_type":2},
            'GET',
            'mod.submod.cb'
        );
    }

    return {
            init : init,
            cb : cb,
            get_dl : get_dl,
            get_preview : get_preview
    };
}();

mod.submod.init();

setTimeout("mod.submod.get_dl()", 500);

setTimeout("mod.submod.get_preview()", 500);

</script>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值