自定义事件是一种处理与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. UIButton在不同状态下显示不同背景色

    参考自:原文地址(内容与原文并无区别,只是自己以后方便使用整理了一下) 1.UIButton的background是不支持在针对不同的状态显示不同的颜色. 2.UIButton的backgroundI ...

  2. IOS开发之功能模块--自定义导航控制器类常用自定义的代码

    前言:本文篇幅不多,但是涉及到的内容却是开发中常用的. 涉及的内容: 1.统一设置导航控制器子控制器的返回按钮. 2.因为修改了系统的返回按钮,所以还需要设置手势事件. 3.隐藏底部的工具条. 这里直 ...

  3. IPv4中IP地址分类

    分三个部分进行讲述: 1 五类IP 2 特殊用途的IP 3 私有IP 1 五类IP IPV4简单粗暴地把IP地址分为五类.分类方法如下图所示: 也就是说,分为以下几类: A: 0.0.0.0-127. ...

  4. C#初级知识点整理及VS的简单使用

    C#预处理器指令#define #undef 声明一个不需赋值的变量注意的一点事它必须放到using 上面,如 #define TEST using System.xxx; public class ...

  5. MFC Grid control 2.27

    原文链接地址:http://www.codeproject.com/Articles/8/MFC-Grid-control MFCGridCtrl是个强大的类,用于数据的表格显示. 1.类特征 Cel ...

  6. IIS does not list a website that matches the launch url

    233down voteaccepted I hate answering my questions: in my question i stated that i was running VS un ...

  7. 问题解决——OpenGL超级宝典 关于gltDrawTorus的错误解决

    看OpenGL超级宝典的时候,遇到一个函数 “gltDrawTorus”,在TRANSFORM和SPHEREWORLD中都有用到.但是一开始在自己写示例代码里时却没法使用,而在作者的代码目录结构下却可 ...

  8. Apache2.4和Apache2.2访问控制配置语法对比

    一.访问控制 在Apache2.2版本中,访问控制是基于客户端的主机名.IP地址以及客户端请求中的其他特征,使用Order(排序), Allow(允许), Deny(拒绝),Satisfy(满足)指令 ...

  9. c++基础回顾

    #include <iostream> #include <vector> #include <string> int main(int argc, const c ...

  10. Example to use django queryset

    from django.db.models import get_app, get_models, get_model from django.db import models #get the ce ...