JS自定义事件之选项卡
自定义事件是一种处理与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自定义事件之选项卡的更多相关文章
- js自定义事件、DOM/伪DOM自定义事件
一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...
- 漫谈js自定义事件、DOM/伪DOM自定义事件
一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...
- js 自定义事件 包含 添加、激活、销毁
1.思路 (1)构思 var eventTarget = { addEvent: function(){ //添加事件 }, fireEvent: function(){ //触发事件 }, remo ...
- js自定义事件
自定义事件的本质,创建一个对象,然后把事件的名字作为对象的一个属性,然后value是一个[],把此事件的所以回调都push进去. 写一个很基本的,没有把对象暴露出去的js的自定义事件. var eve ...
- js自定义事件CustomEvent、Event、TargetEvent
1.Event Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 事件通常与函数结合使用,函数不会在事件发生前被执行! Event的事件都是系统自 ...
- JS自定义事件(Dom3级事件下)
原文出处: http://www.w3cfuns.com/notes/11861/e21736a0b15bceca0dc7f76d77c2fb5a.html . 我拿出作者中的一段,感谢作者原创. ...
- 转: JS自定义事件的定义和触发(createEvent, dispatchEvent)
四.伪DOM自定义事件 这里的“伪DOM自定义事件”是自己定义的一个名词,用来区分DOM自定义事件的.例如jQuery库,其是基于包装器(一个包含DOM元素的中间层)扩展事件的,既与DOM相关,又不直 ...
- vue.js 自定义事件
<div id="app"> <h2>{{num}}</h2> <h1>全局组件</h1> <my-compone ...
- cocos2d JS 自定义事件分发器(接收与传递数据) eventManager
简而言之,它不是由系统自动触发,而是人为的干涉 较多情况用于传递数据 var _listener1 = cc.EventListener.create({ event: cc.EventListene ...
随机推荐
- UISlider常见属性
常见属性 self.mySlider.minimumValue = 0.0; // 最小值 self.mySlider.maximumValue = 10; // 最大值 self.mySl ...
- 【原】iOS下KVO使用过程中的陷阱
KVO,全称为Key-Value Observing,是iOS中的一种设计模式,用于检测对象的某些属性的实时变化情况并作出响应.网上广为流传普及的一个例子是利用KVO检测股票价格的变动,例如这里.这个 ...
- CoreAnimation-08-CATransition
概述 简介 CATransition又称转场动画,是CAAnimation的子类,可以直接使用 转场动画主要用于为图层提供移入/移出屏幕的动画效果 转场动画常见的应用是UINavigationCont ...
- Visual Studio 2013常用快捷键
---恢复内容开始--- 代码选择 1 区域代码选择 按Shift选择整(行)块代码,可配合四个方向键(左右键:选择单个字符,上下键:上下行的当前列).Home(当前行首).End(当前行尾).Pg ...
- OOD沉思录 --- 类和对象的关系 --- 包含关系2
4.6 尽量让类中定义的每个方法尽可能多地使用包含的对象(即数据成员) 这其实就是高内聚的翻版强调.如果每个类的情况并非如此,那很可能是这一个类表示了两个或更多的概念,记住一个类只应该表示一个概念. ...
- (ios7) 解决Ios7中,Navigatebar 显示在主View中,和ios6 不一致问题
在ios 7 系统中 NavigateBar 显示在主View中 ,Ios6 不在主View中,导致后台代码的方式编写View不一致 解决方法: 在ViewControl的viewDidLoad 方法 ...
- 【等待事件】序列等待事件总结(enq: SQ - contention、row cache lock、DFS lock handle和enq: SV - contention)
[等待事件]序列等待事件总结(enq: SQ - contention.row cache lock.DFS lock handle和enq: SV - contention) 1 BLOG文档结 ...
- 关于Redis持久化
Redis有两种持久化的方式:快照(RDB文件)和追加式文件(AOF文件) RDB持久化方式是在一个特定的间隔保存某个时间点的一个数据快照. AOF(Append only file)持久化方式则会记 ...
- JAVA基础拾遗-论线程池的线程粒度划分与深浅放置
摘要:多线程任务处理对提高性能很有帮助,在Java中提供的线程池也方便了对多线程任务的实现.使用它很简单,而如果进行了不正确的使用,那么代码将陷入一团乱麻.因此如何正确地使用它,如以下分享,这个技能你 ...
- LessonFifth Redis的持久化功能
#验证redis的快照和AOF功能 1.先验证RDB快照功能,由于AOF优先级高,先关闭,然后测试,截图如下 2.设置打开AOF 然后进行实验,截图如下: ...