前一篇文章有写到form表单+iframe的方式,需要处理跨域的问题,里面用到一个代理文件,例子中给的非常简单,这里补上一个功能比较完善的前端代理文件,能兼容多种参数,多种回调。
前端代理文件:http://www.baidufe.com/proxy
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>Proxy Page</title>
<script type="text/javascript">
(function(){
if(top !== self){
var s = (location.hash || location.search).substr(1).split('&'), //提取参数
fun = '', // 回调方法
isParentScope = false, g, scope, //范围:parent or top
reg = /[^\w\.]/g, // 回调方法正则
args = {},isArgsJson = true,
domain = "baidufe.com"; // 参数
for(var i=0,l=s.length,item;i<l;i++){
item = (s[i] || '').split('=');
if(item[0] === 'fun'){ // 回调方法
fun = item[1].replace(reg, '');
}else if(item[0] === 'parent' && item[1]){ // 标记范围
isParentScope = true;
}else if(item[0] === 'domain' && item[1]){ // 标记范围
domain = item[1];
}else if(item[0] === 'arg'){ // 聚合参数
if(isArgsJson) {
isArgsJson = false;
args = [];
}
args.push(item[1]);
}else{ // 参数聚合
args[item[0].replace(reg, '')]=(item[1] || '').replace(/[><\'\"\{\}]/g, '');
}
}
// 设置scope
var _setScope = function(isParentScope) {
if(isParentScope) {
scope = g = parent;
}else{
scope = g = top;
}
};
// domain校验、设定
try{
_setScope(isParentScope);
// 这一步用来校验是否存在跨域问题
scope.document;
}catch(ex){
// 跨域了,就需要设置domain了
document.domain = domain ;
_setScope(isParentScope);
}
try{
fun = fun.split('.');
if(fun[0] === 'window'
|| fun[0] === 'document'
|| fun[0] === 'location'
|| fun[0] === 'alert'
|| fun[0].indexOf('.alert') > -1){
}else{
// 回调方法拼接
for(var i=0,l=fun.length;i<l;i++){
if(i<l-1){
scope = scope[fun[i]];
}
g = g[fun[i]];
}
// 方法回调
if(isArgsJson){
g.call(scope,args);
}else{
g.apply(scope,args);
}
}
}catch(e){}
}
})();
</script>
</head>
<body>
</body>
</html>