不要使用jQuery触发原生事件的方法


Posted in Javascript onMarch 03, 2014

JavaScript 框架提供了如此多的功能,以至于一不小心就会掉进坑里去。 对工具库依赖得越多,在修改或维护时一个小小的改的很可能就会影响到其他的功能(俗称 处处是地雷,走路需谨慎),特别是维护多年前的遗留代码时。 我经常看到的一个错误是关于 jQuery的 trigger, trigger允许开发者手动触发某些事件。 这个功能真的非常强大与好用,但是请遵守约定,不要触发JS中那些原生的事件名称!
注:我知道,其他JS框架也提供这种功能 —— 我只用jQuery作为一个例子,因为我看到了它的受欢迎程度,最近又刚好碰上这个问题。 而所有工具类库都有可能引发同样的问题。 比如 MooTools使用 的 fireEvent 等。
下面是使用 trigger 来完成任务的一个典型例子:

// 监听 click 事件 
jQuery('.tabs a').on('click', function() { 
// 执行某些操作,比如切换界面,加载内容等.. 
}); // 在最后一个 a 标签上触发 click 事件 
jQuery('.tabs a').last().trigger('click');

上面的代码将会打开给定index的tab标签。 我完全理解开发者使用 trigger 来处理这些事情的原因,通常是因为要触发的函数在全局范围内不可用,而触发事件是很容易的,也总是可用的。 问题是,使用原生的事件名称来触发可能 ... 触发 ... 一些无法言说的伤。让我们来看看在网站的其他地方添加的内容:
// 监听 body 内部的所有 click 事件 
jQuery('body').on('click', 'a', function() { 
// 此处可以进行一些业务逻辑处理 ... // 满足条件(Condition met), 则进行另外一些操作! 
if(conditionMet) { 
// 刷新页面? 
// 打开子菜单? 
// 提交表单? 
// ... 灯灯蹬蹬,Intel 
} 
});

现在有一个问题 —— 选项卡单击事件可能被其他完全独立的部分监听着,这处理起来就比较麻烦。 呵呵,最好的解决方案是使用一个自定义的事件名称跟在原生事件后面:
// 监听 click 事件时,带上自定义的事件 
jQuery('.tabs a').on('click tabs-click', function() { 
// 切换 tab, 加载内容,等等等等 ... 
}); // 在最后一个标签上触发 "假" 的事件 
jQuery('.tabs a').last().trigger('tabs-click');

现在你的事件触发器将不再和页面上的其他监听器起冲突。 保守的开发人员对我说,你可能想要避免使用 trigger (其他工具库也是一样的),但好歹你也应该添加一个自定义事件名称!
Javascript 相关文章推荐
对JavaScript的eval()中使用函数的进一步讨论
Jul 26 Javascript
javascript Select标记中options操作方法集合
Oct 22 Javascript
javascript multibox 全选
Mar 22 Javascript
javascript写的一个链表实现代码
Oct 25 Javascript
使用js+jquery实现无限极联动
May 23 Javascript
jquery日历控件实现方法分享
Mar 07 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
Oct 17 Javascript
总结在前端排序中遇到的问题
Jul 19 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
Dec 16 Javascript
Angular企业级开发——MVC之控制器详解
Feb 20 Javascript
VueJs监听window.resize方法示例
Jan 17 Javascript
vue实现打地鼠小游戏
Aug 21 Javascript
jquery实现点击消失的代码
Mar 03 #Javascript
jquery提交form表单简单示例分享
Mar 03 #Javascript
jquery序列化form表单使用ajax提交后处理返回的json数据
Mar 03 #Javascript
js函数在frame中的相互调用详解
Mar 03 #Javascript
window.onload追加函数使用示例
Mar 03 #Javascript
js this函数调用无需再次抓获id,name或标签名
Mar 03 #Javascript
解决Jquery鼠标经过不停滑动的问题
Mar 03 #Javascript
You might like
php生成随机数或者字符串的代码
2008/09/05 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
php实现的日历程序
2015/06/18 PHP
php简单判断文本编码的方法
2015/07/30 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
php抽象方法和普通方法的区别点总结
2019/10/13 PHP
简单的JS多重继承示例
2008/03/13 Javascript
javascript开发随笔二 动态加载js和文件
2011/11/25 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
js如何判断输入字符串长度
2015/12/16 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
浅谈react-native热更新react-native-pushy集成遇到的问题
2017/09/30 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
2019/05/26 Javascript
Python语法快速入门指南
2015/10/12 Python
Python实现树的先序、中序、后序排序算法示例
2017/06/23 Python
Python网络编程使用select实现socket全双工异步通信功能示例
2018/04/09 Python
python+opencv实现霍夫变换检测直线
2020/10/23 Python
利用python Selenium实现自动登陆京东签到领金币功能
2019/10/31 Python
python 多线程死锁问题的解决方案
2020/08/25 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
德国足球商店:OUTFITTER
2019/05/06 全球购物
活动策划邀请函
2014/02/06 职场文书
设计大赛策划方案
2014/06/13 职场文书
党的群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
工作失职检讨书500字
2014/10/17 职场文书
2016年中秋节慰问信
2015/12/01 职场文书
nginx配置ssl实现https的方法示例
2021/03/31 Servers
高端收音机+蓝牙音箱,JBL TUNER FM带收音蓝牙音箱评测
2021/04/24 无线电
java多态注意项小结
2021/10/16 Java/Android
python实现简单石头剪刀布游戏
2021/10/24 Python
关于MySQL中的 like操作符详情
2021/11/17 MySQL
如何避免mysql启动时错误及sock文件作用分析
2022/01/22 MySQL
Python实现灰色关联分析与结果可视化的详细代码
2022/03/25 Python