自定义事件是一种处理与DOM产生交互的代码逻辑片段之间耦合的很好的架构方法。

一个简单的jQuery插件——选项卡

让ul列表来响应点击事件。当用户点击一个列表项时,给这个列表项添加一个名为active的类,同时将其他列表项中的active类移除:

<ul id="tabs">
<li data-tab="users">users</li>
<li data-tab="groups">groups</li>
</ul>
<div id="tabsContent">
<div data-tab="users">uuuuuuuuuu</div>
<div data-tab="groups">ggggggggg</div>
</div>

一般处理方式

jQuery.fn.tabs = function(control) {
var $tabs = $(this),
$control = $(control); $tabs.find('li').click(function() {
// 从列表项中删除和添加active类
$tabs.find('li').removeClass('active');
this.className = 'active'; // 对应内容的显示
var tabName = $(this).attr('data-tab');
$control.find('[data-tab]').hide();
$control.find('[data-tab="' + tabName +'"]').show();
}); // 初始化状态
$tabs.find('li:first').addClass('active'); // 选中选项卡
$control.find('>[data-tab]').hide().first().show(); // 只显示第一个div return this;
};

现在看上去插件没有什么问题。但可以做下列优化:我们给所有的列表项都添加了click事件回调,可以用事件委托来优化它;点击事件回调的实现很臃肿,很难一眼看出发生了什么;最后,如果另一个开发者想要扩展这个插件,他很可能会将其重写。

优化后的代码

使用自定义事件让代码变得更加整洁。

在点击选项卡时触发一个change.tabs事件,并绑定若干回调方法来适当修改active类。

// 自定义事件tabs.change
// 缓存选项卡元素,减少DOM直接查找
jQuery.fn.tabs2 = function(control) {
var $tabs = $(this),
$control = $(control),
$lis = $tabs.find('li'); // 利用事件委托,监听单击选项卡事件
$tabs.on('li', 'click', function() {
// 单击的选项卡的data-tab属性值
// var tabName = $(this).attr('data-tab');
var tabName = this.getAttribute('data-tab'); // 自定义属性需要用getAttribute()获取
// 在单击时触发自定义事件
$tabs.trigger('change.tabs', tabName);
}); // 绑定自定义事件
// 解耦回调函数,易扩展
$tabs.bind('change.tabs', function(e, tabName) {
$lis.removeClass('active').filter('[data-tab="'+ tabName +'"]').addClass('active');
}); $tabs.bind('tabs.change', function(e, tabName) {
$control.find('>[data-tab]').hide();
$control.find('>[data-tab="'+ tabName +'"]').show();
}); // 初始化状态
var firstName = $lis.first().attr('data-tab');
$tabs.trigger('tabs.change', firstName); return this;
};

JS自定义事件之选项卡的更多相关文章

  1. js自定义事件、DOM/伪DOM自定义事件

    一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...

  2. 漫谈js自定义事件、DOM/伪DOM自定义事件

    一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...

  3. js 自定义事件 包含 添加、激活、销毁

    1.思路 (1)构思 var eventTarget = { addEvent: function(){ //添加事件 }, fireEvent: function(){ //触发事件 }, remo ...

  4. js自定义事件

    自定义事件的本质,创建一个对象,然后把事件的名字作为对象的一个属性,然后value是一个[],把此事件的所以回调都push进去. 写一个很基本的,没有把对象暴露出去的js的自定义事件. var eve ...

  5. js自定义事件CustomEvent、Event、TargetEvent

    1.Event Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 事件通常与函数结合使用,函数不会在事件发生前被执行! Event的事件都是系统自 ...

  6. JS自定义事件(Dom3级事件下)

    原文出处:  http://www.w3cfuns.com/notes/11861/e21736a0b15bceca0dc7f76d77c2fb5a.html . 我拿出作者中的一段,感谢作者原创. ...

  7. 转: JS自定义事件的定义和触发(createEvent, dispatchEvent)

    四.伪DOM自定义事件 这里的“伪DOM自定义事件”是自己定义的一个名词,用来区分DOM自定义事件的.例如jQuery库,其是基于包装器(一个包含DOM元素的中间层)扩展事件的,既与DOM相关,又不直 ...

  8. vue.js 自定义事件

    <div id="app"> <h2>{{num}}</h2> <h1>全局组件</h1> <my-compone ...

  9. cocos2d JS 自定义事件分发器(接收与传递数据) eventManager

    简而言之,它不是由系统自动触发,而是人为的干涉 较多情况用于传递数据 var _listener1 = cc.EventListener.create({ event: cc.EventListene ...

随机推荐

  1. 【原】iOS动态性(一):动态添加属性的方法——关联(e.g. 向Category添加属性)

    想到要如何为所有的对象增加实例变量吗?我们知道,使用Category可以很方便地为现有的类增加方法,但却无法直接增加实例变量.不过从Mac OS X v10.6开始,系统提供了Associative ...

  2. 在iOS 8中使用UIAlertController

    iOS 8的新特性之一就是让接口更有适应性.更灵活,因此许多视图控制器的实现方式发生了巨大的变化.全新的UIPresentationController在实现视图控制器间的过渡动画效果和自适应设备尺寸 ...

  3. GCD中使用dispatch_after函数延迟处理任务

    在实际的开发中,经常会遇到想要在指定的时间间隔后执行某个处理 <一>在GCD中提供了dispatch_after函数来完成这一操作 dispatch_after(dispatch_time ...

  4. IO流02--毕向东JAVA基础教程视频学习笔记

    提要 08 自定义装饰类09 LineNumberReader10 MyLineNumberReader11 字节流File读写操作12 拷贝图片13 字节流的缓冲区14 自定义字节流的缓冲区-rea ...

  5. InfluxDB数据备份与恢复

    数据备份与恢复 Example:(192.167.8.13 InfluxDB:DeviceHistory备份到192.167.8.52,然后恢复到该服务器上)   steps:   login 192 ...

  6. xamarin.android 给View控件 添加数字提醒效果-BadgeView

    本文代码从java项目移植到.net项目   java开源项目:https://github.com/jgilfelt/android-viewbadger using System; using S ...

  7. Linux学习之六——使用vi和vim

    一.vi的三种模式和相互切换 1. 一般模式 1) 移动光标 可以用箭头键,Page Up, Page Down, Home,End等按键移动光标 G,移动到档案最后一行 1G,gg,移动到档案第一行 ...

  8. 如何判断两个String是否是Anagrams_java实现

    Anagrams:是颠倒字母顺序的字符串 本文提供三个方法,分别分析时间空间复杂度 方法一:暴力遍历 时间复杂度:O(n^2) 方法二:基于排序算法,Sorting的时间复杂度是O(n*log(n)) ...

  9. Java 开发环境部署

    1.下载Java开发环境工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载后,双击jdk ...

  10. uva 11054 wine trading in gergovia (归纳【好吧这是我自己起的名字】)——yhx

    As you may know from the comic \Asterix and the Chieftain's Shield", Gergovia consists of one s ...