从神奇的"$"函数开始 "$"函数将在文档加载完成之后为一个指定的button 绑定事件,这些代码在单个网页中工作正常。但是如果我们还有其它的网页,我们将不得不重复这个过程。 复制代码 代码如下: <a href="javascript:;" id="sayHello">Say Hello</a> <script type="text/javascript"> //when dom ready, do something. //bind click event to a button. $(function(){ $("#sayHello").click(function(){ alert("Hello world!"); }); }); </script>
如果我们需要另一个行为的button怎么办?比如象这样: 复制代码 代码如下: <a href="javascript:;" id="sayUnlike">Unlike it</a> <script type="text/javascript"> //when dom ready, do something. //bind click event to a button. $(function(){ $("#sayUnlike").click(function(){ alert("I unlike it."); }); }); </script>
接下来,更多的问题出现了,我们需要很多这样的button, 这好象也不难。 复制代码 代码如下: <a href="javascript:;" class="sayUnlike">Unlike it</a> <script type="text/javascript"> //Change to a class selector to match all the button elements. $(function(){ $(".sayUnlike").click(function(){ alert("I unlike it."); }); }); </script>
我们的项目功能越来越复杂,经过一段时间以后,变成了这个样子, quick but dirty...... 复制代码 代码如下: <? if($page == "A" or $page == "C" and $page is not "D"){ ?> <script type="text/javascript"> ...... </script> <? } ?> <? if($page == "B" or $page == "E" and $page is not "X"){ ?> <script type="text/javascript"> ..... </script> <? } ?> <? if($page == "B" or $page == "E" or $page == "C"){ ?> <script type="text/javascript"> ..... </script> <? } ?>
这真是太糟糕了,我们需要在一个页面上加载许多个代码片断才能绑定所有的事件,如果我们再将不同的代码分装入多个js文件中这将增加多个页面资源的http请求,不论是管理还是用户体验都将面临挑战,我们需要找到一个更佳的解决方案。 既然 class selector 的开销这么大,我们能不能在一次扫描中绑定所有的事件?我们可以尝试一下: 复制代码 代码如下: <script type="text/javascript"> //Register global name space. var Yottaa = Yottaa || {}; Yottaa.EventMonitor = function(){ this.listeners = {}; } //Bind all event. Yottaa.EventMonitor.prototype.subscribe=function(msg, callback){ var lst = this.listeners[msg]; if (lst) { lst.push(callback); } else { this.listeners[msg] = [callback]; } } // Create the event monitor instance. var event_monitor = new Yottaa.EventMonitor(); function load_event_monitor(root){ var re = /a_(w+)/; //using a regular expression to filter all event object. var fns = {}; $(".j", root).each(function(i) { var m = re.exec(this.className); if (m) { var f = fns[m[1]]; if (!f) { //如果事件处理函数不存在则创建函数对象. f = eval("Yottaa.init_"+m[1]); fns[m[1]] = f;//调用绑定函数. } f && f(this); } }); } $(function(){ // when dom ready, bind all event. load_event_monitor(document); }); //Here is 2 sample components. Yottaa.init_sayhello = function(obj){ $(obj).click(function(){ alert("Hello world!"); }); } Yottaa.init_unlike = function(obj){ $(obj).click(function(){ alert("I unlike it."); }); } </script>