首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

今日无聊javascript写了一个可以监听函数的小插件 新手

2013-09-18 
今天无聊javascript写了一个可以监听函数的小插件 新手本帖最后由 ty646169607 于 2013-09-10 22:32:57 编

今天无聊javascript写了一个可以监听函数的小插件 新手
本帖最后由 ty646169607 于 2013-09-10 22:32:57 编辑 主要功能就是:
可以监听一个指定的函数,当被监听的函数被人调用的时候,会先调用监听的回调函数,\

当回调函数返回true时,才会继续调用被监听的函数,

返回不是true的时候,直接将回调返回的值返回给调用者.

这里是源文件:

//应用到所有Object类型中  
Object.prototype.monitor=monitor;  
/* 
    函数监听,可以监听指定的函数,函数调用前会先调用monitorFun方法,方法返回true则放行,返回其他的则直接将返回数据返回给调用方 
    funName:要监听的函数名字 
    monitorFun:回调函数,回调函数会接受到调用方调用的参数数组,在回调中可以修改参数。 
  */  
function monitor(funName,monitorFun){  
    //var mCaller=monitor2.caller;  
    //alert(mCaller);  
    //var parentObj = (mCaller==null?window:mCaller);  
    var parentObj = this;  
    var funTemp = parentObj[funName];  
    //生成拦截方法  
    var ljFun=function(){  
        //调用回调函数 来判断是否放行  
        var ret = monitorFun(arguments);  
        //alert(ret+""+(ret==true));  
        if(ret==true){  
            //准备生成参数  
            //声明变量  
            var evText = "";  
            //参数格式  
            var csText = "";  
            for(var a = 0;a<arguments.length;a++){  
                evText+="var a"+a + "="+ "arguments["+a+"];"  
                csText+="a"+a+(a==0?"":",");  
            }  
            eval(evText);  
            return eval("funTemp("+csText+")");  
        }  
        return ret;  


        //alert("拦截成功!");  
    };  
    parentObj[funName]=ljFun;  
}  



以下是测试代码:

<html>  
    <head>  
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
        <script type="text/javascript" src="JRY.js"></script>  
        <script type="text/javascript">  
            //普通的方法  
            function test(text){  
                alert(text);  
            }  
            //调用监听方法  
            monitor("test",function(cs){  
                alert("监听到调用:\n参数:"+cs[0]);  
                //修改参数  
                cs[0] = "我是JRY";  
                return true;  
            });  
            //对象  
            function Obj(){  
                function test(){  
                    return("我是JRY");  
                }  
            }  
            var obj = new Obj();  
            //调用监听方法  
            obj.monitor("test",function(cs){  


                //当返回值不是true的时候,将不会调用被监听的方法  
                return "我不是JRY";  
            });  
        </script>  
    </head>  
    <body>  
        <button onclick="test('无聊的人')">普通方法</button>  
        <button onclick="alert(obj.test())">对象方法</button>  
    </body>  
</html>  



可以拦截系统的函数哈   新手作品  求大家点评,点评.....
ps:其实刚开始的思路是为了 消除一个框架的过期提示(哈哈).. javascript 插件
[解决办法]
有考虑死循环吗?
[解决办法]
个人理解这并非监听,而是改写了函数。
“消除一个框架的过期提示”其实你改写系统的alert函数即可,判断是过期提示内容就不弹出,其他放行即可。
[解决办法]
没太仔细看你的代码  但感觉有可能反而破坏原来的意图
比如
function Obj(){  
         this.test=function(){
 alert('a');
             return "我是JRY";  
          }  
    }  
这样我应该是可以访问对象的方法的 貌似你的方法是通过eval重搞了test方法(??) 导致这个对象的方法无效了(??)
没太仔细研究  错误理解了见谅
[解决办法]
引用:
这里是源文件:


...
        if(ret==true){  
            //准备生成参数  
            //声明变量  
            var evText = "";  


            //参数格式  
            var csText = "";  
            for(var a = 0;a<arguments.length;a++){  
                evText+="var a"+a + "="+ "arguments["+a+"];"  
                csText+="a"+a+(a==0?"":",");  
            }  
            eval(evText);  
            return eval("funTemp("+csText+")");  
        }  



要调用原来的函数,可以用:

   if (ret == true) {
      return funTemp.apply(parentObj, arguments);
   }

热点排行
Bad Request.