Tags标签 网战地图
当前位置: 主页 > 网页设计 > JavaScript >

js动态代理

2014-06-09 21:56 [JavaScript] 来源于:
导读:最近公司的产品陆续跟其他网站有合作,麻烦的是每个网站都有个性化的需求,有的需要自己的logo,有的需要定制的广告。 例如默认我们显示的是Google广告 http://

最近公司的产品陆续跟其他网站有合作,麻烦的是每个网站都有个性化的需求,有的需要自己的logo,有的需要定制的广告。

例如默认我们显示的是Google广告 http://www.wangchao.net.cn/bbsdetail_1950471.html

但是此站需要专门显示旅游类广告 http://www.wangchao.net.cn/bbsdetail_1950471.html

产品的UI相当复杂,hard code 当然是不能接受的。此时我很怀念我当年在.net用的Windsor,于是马上弄了个动态代理出来(对动态语言来说是小菜一碟),让我能给特定的宿主网站通过添加额外的js文件注入自己定制的代码

(function(){
var interceptors = {};
$.intercept = function(name, func){
 var parts = name.split('.');
 var owner = window;
 for (var i = 0; i < parts.length - 1; i++){
  owner = owner[parts[i]];
  if (!owner) break;
 }
 if (owner){
  var funcName = parts[parts.length - 1];
  var target = owner[funcName];
 }
 if (!(owner && target)){
  interceptors[name] = func;
  return;
 }
 owner[funcName] = function(){
  this.__invocation__ = target;
  func.apply(this, arguments)
 }
}
    
 $._ = function(name, func, scope, args){
  var interceptor = interceptors[name];
  if (interceptor){
   scope = scope || window;
   scope.__invocation__ = func;
   return interceptor.apply(scope, args || []);
  }
  else {
   return func.apply(scope, args || []);
  }
 }
})()

要拦截函数很简单,以被拦截的函数名和用于拦截的函数为参数

$.intercept = function('objectName.methodName', function(){
//do something
//and invoke the original method if needed
this.__invocation();
})

 

(编辑:)

本文标签:
网友评论

栏目列表

推荐文章