开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1550|回复: 2
收起左侧

[js/PHP求助] JavaScript 钩子机制

[复制链接]

发表于 2013-2-23 13:32:14 | 显示全部楼层 |阅读模式   山东省济南市
我们讨论过使用委托方法,把所有的回调函数注册到一个数组变量中,然后集中处理数组变量中的函数,这样就不会出现后面的函数冲击前面的函数问题。——因为原来回调函数就一个。
AD: 2013大数据全球技术峰会低价抢票中


介绍
今天大家开会共同解决了一些javascript方面的问题,大家一起想办法,最终大家选择了钩子机制。
我把整个过程与大家分享一下,如果有误,请大家指正。
问题
是这样的:我们的代码已经历史很久了,就这一套框架已经快5年了,在这中间大家也没有标准的代码规范,很随意的进行了代码编写,所以出现了很多问题:
1、如制造了很多重复的轮子。一套方法在多个文件中出现,大家调用的也五花八门,所以同事在一个方法(登录)中添加逻辑的时候发现,多个地方都有这样登录操作,修改起来非常麻烦。
2、代码结构混乱,分工不明确,本来公共类做的事情,导航类也做了类似的操作。
3、回调函数的使用,出现多个回调函数,从而出现一个回调函数会覆盖前一个回调函数的情况。
前两个问题,我首先把所有的入口文件(调用登录的方法)统一使用公共类中的方法,并且是一个入口一个入口的进行验证,保证代码的安全性、稳定性。并且不删除原有的方法,害怕有遗漏。然后计划是一个月之后,再进行一次全站搜索看是否有人还使用其他接口,然后删除那些重复的方法。
下面主要讨论第三个问题的解决方法。
委托方法
我们讨论过使用委托方法,把所有的回调函数注册到一个数组变量中,然后集中处理数组变量中的函数,这样就不会出现后面的函数冲击前面的函数问题。——因为原来回调函数就一个。
下面是具体的代码过程
定义全局变量

    <head>  
  •        <script type="text/javascript">  
                  var calls = [];       </script>  
  • </head>
注册方法

    function need_register(){  
  • }  
    function test(){  
  •       calls.push('need_register');  
  • }
  最终执行注册代码 

    function callback(){  
  •      var calls = calls || [];  
         if(calls.length === 0) return false;  
  •      for(var i=0, iLen = calls.length; i < iLen; i++){  
                 calls.apply();  
  •       }  
  • }  
问题:
1、我们不难发现我们必须要有全局变量calls,我们知道全局变量不管在什么语种中都是最难维护的,因为到处都有可能修改里面的值,或改变整个全局变量。
2、在注册时候我们会在多个地方在calls中注册"函数名称",将来如果其他开发人员,看见这个变量会一头雾水的。——东一榔头,西一棒子。
总结:所以最终我们决定放弃这个方法。想出了下面的方法,我们管它叫钩子机制,也许名称上有点不够直观,呵呵大家就权当学习整个方法吧。

钩子机制
钩子机制是这样的,大家按照某一规则写一个方法(这个规则在方法名称上),然后页面加载完之前,统一执行所有的钩子函数。
注意callHooks方法,里面的局部变量s就是钩子函数名称中一定要有的内容。——这是使用钩子的方法!

    // 处理钩子的对象  
  • var hook = (function(){  
        return {  
  •         timer:null,  
            init:function(){  
  •             this.callHooks('init');  
            },   
  •         callHooks:function(init){  
                var s = "hook_" + init + '_event',  
  •             f = [];   
                for(var h in window){  
  •                 if(h.indexOf(s) != 0) continue;  
                    f.push(h);  
  •             }     
                this.hooksTimeout(f);  
  •         },   
            hooksTimeout:function(hooks){  
  •             if(0 === hooks.length){  
                    if(this.timer) clearTimeout(this.timer);  
  •                 return;  
                }     

  •             var h = hooks.shift();  
  •             window[h].apply();  
                window[h] = undefined;  

  •             window.setTimeout(this.hooksTimeout(hooks), 200);  
  •         }     
        }     
  • }());  
  • // 钩子1  
    var hook_init_event_tpl_html = function(){  
  •     document.getElementById('test').innerHTML = 'This is HTML!';  
    }  

  • // 钩子2  
  • var hook_init_event_tpl_console = function(){  
        console.log('This is console!');  
  • }  
  • // 最好在页面加载完之前调用,也就是在window.onload()之前  
  • hook.init();
总结
很多问题,如果大家一起讨论是很有帮助的,在这过程中我们能学到很多东西,我们也可以在这过程中从牛人身上学到很多方法和思维过程,几乎每次的技术讨论会我都有不菲的收获——我不知道这是不是传说中的“头脑风暴”。


发表于 2013-4-1 09:33:48 | 显示全部楼层   河南省驻马店市
鉴定完毕.!
回复 支持 反对

使用道具 举报

结帖率:90% (9/10)
发表于 2013-2-23 13:44:01 | 显示全部楼层   广东省佛山市
虽然看不懂,但还是沙发了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表