自定义事件是一种处理与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. 多种cell混合使用

    有时候我们会碰到一个tableView上有多种cell,这个时候就需要定义多种cell,根据条件判断,当满足某个条件的时候选择某个cell 先看plist文件: Person.h #import &l ...

  2. 基础学习day05---面向对象一类,对象、封装

    一.面向对象   1.1.面向对象的概念    很经典的一句话----------万物皆对象 定义:面向对象一相对面向过程而言的        面向对象和面向过程都是一种思想       面向过程-- ...

  3. 基础学习day03---程序结构与控制、函数与数组入门

    一.程序结构   1.顺序结构 2.选择结构 3.循环结构 二.顺序结构 程序至上而下逐行执行,一条语句执行完之后继续执行下一条语句,一直到程序的末尾 三.条件选择结构 选择结构是根据条件的成立与否, ...

  4. 揭开智能配置上网(微信Airkiss)的神秘面纱

    本文介绍微信利用Airkiss技术对wifi设备进行智能配置上网的场景,并分析其实现的原理.这里再次说明,Airkiss只是用于配置上网,其跟微信硬件平台的通信流程和接入协议规范完全没有关系.一个wi ...

  5. 多线程在iOS开发中的应用

    多线程基本概念 01 进程 进程是指在系统中正在运行的一个应用程序.每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 02 线程 2-1 基本概念 1个进程要想执行任务,必须得有线程 ...

  6. android学习笔记 对话框合集

    package com.zhangbz.dialog; import android.app.Activity; import android.app.AlertDialog; import andr ...

  7. CocoaPods的安装(图文并茂)OS X 10.11 系统

    这里是前言,可以跳过前言部分直接跳到后面"这里正式安装"开始看步骤: 系统:OS X EI Capitan 版本:10.11.2 开发工具:XCode:7.2 先给一个挺不错的关于 ...

  8. iOS 中二维码扫描

    随着微信的大量推广,越来越多的人会在生活中用到二维码这一个方便大家的功能. 因此,很多的app中也逐渐的都加入了二维码这个元素,今天先给大家介绍一下iOS7后系统自带自己可以手动设计的二维码扫描. Q ...

  9. Memcache修改端口

    修改端口 网上很多的说法都无法起作用(像下面这样) D:\.......memcached -p 10000 -d start 现在有两种解决方法 ①直接修改注册表 HKEY_LOCAL_MACHIN ...

  10. Java中的显示锁 ReentrantLock 和 ReentrantReadWriteLock

    在Java1.5中引入了两种显示锁,分别是可重入锁ReentrantLock和可重入读写锁ReentrantReadWriteLock.它们分别实现接口Lock和ReadWriteLock.(注意:s ...