第三参数 | 对应事件 | 效果 | 取消事件 |
---|---|---|---|
true | 事件捕捉 | 从外向内传播 | |
false | 事件冒泡 | 从内向外传播 | e.stopPropagation() |
e.preventDefault() / return false
list.addEventListener("click", function(e) { if(e.currentTarget.tagName == "LI") { /**/ } }, false)
以jquery插件为例;下面代码使用自定义事件让代码变得整洁,在点击选项卡时触发一个change.tabs事件,并绑定若干回调方法来修改active类html
<ul id="tabs"> <li data-tab="user">Users</li> <li data-tab="group">Groups</li> </ul> <div id="tabsContent"> <div data-tab="user">user</div> <div data-tab="group">group</div> </div>
jQuery.fn.tabs = function(control) { var elem = $(this); control = $(control); elem.on("click", "li", function() { var tabName = $(this).attr("data-tab"); elem.trigger("change.tabs", tabName); }); elem.on("change.tabs", function(e, tabName) { elem.find("li").removeClass("active"); elem.find(">[data-tab='" + tabName + "']").addClass("active"); }); elem.on("change.tabs", function(e, tabName) { control.find(">[data-tab]").removeClass("active"); control.find(">[data-tab='" + tabName + "']").addClass("active"); }); //将切换选项卡的动做和窗口的hash作关联,这样能够使用浏览器的退后按钮 elem.on("change.tabs", function(e, tabName) { window.location.hash = tabName; }); $(window).on("hashchange", function() { var tabName = window.location.hash.slice(1); elem.trigger("change.tabs", tabName); }) var firstName = elem.find("li:first").attr("data-tab"); elem.trigger("change.tabs", firstName); return this; } $("ul#tabs").tabs("#tabsContent");
var PubSub = { //订阅 subscribe: function(ev, callbacks) { //双重赋值 var calls = this._callbacks || (this._callbacks = {}); (this._callbacks[ev] || (this._callbacks[ev] = [])).push(callbacks); return this; }, //发布 publish: function() { var args = Array.prototype.slice.call(arguments, 0); var ev = args.shift(); var list, calls, i, l; if(!(calls = this._callbacks)) return this; if(!(list = this._callbacks[ev])) return this; for(i = 0, l = list.length; i < l; i++) list[i].apply(this, args); return this; } } PubSub.subscribe("wem", function() {}); PubSub.publish("wem"); //能够使用命名空间的方式管理事件名称 PubSub.subscribe("user:create", function() {});
将其扩充到一个局部对象jquery
var Asset = {}; jQuery.extend(Asset, PubSub); Asset.subscribe("test", function() {alert("test")}); Asset.publish("test");
使用jquery实现该模式编程
(function($) { var o = $({}); $.subscribe = function() { o.bind.apply(o, arguments); }; $.unsubscribe = function() { o.unbind.apply(o, arguments); }; $.publish = function() { var arguments = $.makeArray(arguments); var type = arguments[0]; arguments.shift(); o.trigger.apply(o, [type, arguments]); } })(jQuery); $.subscribe("/some/topic", function(event, a, b, c) { console.log(event.type, a + b +c); }); $.publish("/some/topic","a","b","c");