在JS中,消息的通知是通过事件表达的,当代码库增长到一定的规模就需要考虑将行为和自定义事件进行解耦,通过事件机制可以将类设计为独立的模块,通过事件对外通信提高了程序的开发效率。
了解自定义事件的概念:
理论太抽象,看看 jQuery 框架中如何使用事件。
jQuery 的事件自定义事件还是通过 on 绑定的,然后再通过 trigger 来触发这个事件。
//给element绑定hello事件 element.bind("hello",function(){ alert("hello world!"); }); //触发hello事件 element.trigger("hello");
这段代码这样写似乎感觉不出它的好处,看了下面的例子也许你会明白使用自定义事件的好处了,参考右边的代码。
trigger需要处理的问题
拟冒泡机制
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <style type="text/css"> .active{ color: red; } </style> <script src="http://www.imooc.com/static/lib/jquery/1.9.1/jquery.js" type="text/javascript"></script> <title>自定义事件</title> </head> <body> <ul id="tabs"> <li data-tab="users">Users</li> <li data-tab="groups">Groups</li> </ul> <div id="tabsContent"> <div data-tab="users">part1</div> <div data-tab="groups">part2</div> </div> <script type="text/javascript"> $.fn.tabs = function(control) { var element = $(this); var control = $(control); element.delegate("li", "click", function() { var tabName = $(this).attr("data-tab"); //点击li的时候触发change.tabs自定义事件 element.trigger("change.tabs", tabName); }); //给element绑定一个change.tabs自定义事件 element.bind("change.tabs", function(e, tabName) { element.find("li").removeClass("active"); element.find(">[data-tab='" + tabName + "']").addClass("active"); }); element.bind("change.tabs", function(e, tabName) { control.find(">[data-tab]").removeClass("active"); control.find(">[data-tab='" + tabName + "']").addClass("active"); }); // 激活第一个选项卡 var firstName = element.find("li:first").attr("data-tab"); element.trigger("change.tabs", firstName); return this; }; $("ul#tabs").tabs("#tabsContent"); </script> </body> </html>