不要使用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 相关文章推荐
封装html的select标签的js操作实例
Jul 02 Javascript
JavaScript中九种常用排序算法
Sep 02 Javascript
JavaScript删除指定子元素代码实例
Jan 13 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
Apr 12 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
Aug 05 Javascript
学习JavaScript正则表达式
Nov 13 Javascript
JavaScript中的Array 对象(数组对象)
Jun 02 Javascript
全面了解js中的script标签
Jul 04 Javascript
前端主流框架vue学习笔记第一篇
Jul 26 Javascript
layui 表格的属性的显示转换方法
Aug 14 Javascript
如何基于javascript实现贪吃蛇游戏
Feb 09 Javascript
Vue项目开发常见问题和解决方案总结
Sep 11 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
基于mysql的论坛(3)
2006/10/09 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
PHP设计模式之工厂模式实例总结
2017/09/01 PHP
解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
2019/10/16 PHP
javascript 有用的脚本函数
2009/05/07 Javascript
JQuery 前台切换网站的样式实现
2009/06/22 Javascript
JQuery设置获取下拉菜单某个选项的值(比较全)
2014/08/05 Javascript
JavaScript 基本概念
2015/01/20 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
快速入门Vue
2016/12/19 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
基于vue.js路由参数的实例讲解——简单易懂
2017/09/07 Javascript
原生js封装的ajax方法示例
2018/08/02 Javascript
详解使用angular框架离线你的应用(pwa指南)
2019/01/31 Javascript
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
vue-cli3添加模式配置多环境变量的方法
2019/06/05 Javascript
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
python绘制直线的方法
2018/06/30 Python
将Python文件打包成.EXE可执行文件的方法
2019/08/11 Python
Marriott中国:万豪国际酒店查询预订
2016/09/02 全球购物
JoJo Maman Bébé爱尔兰官网:英国最受欢迎的精品母婴品牌
2020/12/20 全球购物
本科生个人求职自荐信
2013/09/26 职场文书
军训 自我鉴定
2014/02/03 职场文书
幼儿园门卫岗位职责
2014/02/14 职场文书
《中国的气候》教学反思
2014/02/23 职场文书
物业总经理岗位职责
2014/02/28 职场文书
爱祖国演讲稿
2014/05/04 职场文书
干部对照检查材料范文
2014/08/26 职场文书
个人纪律作风整改措施思想汇报
2014/10/12 职场文书
春季运动会开幕词
2015/01/28 职场文书
城管个人总结
2015/02/28 职场文书
求职简历自我评价范文
2015/03/10 职场文书
pandas DataFrame.shift()函数的具体使用
2021/05/24 Python
Java数据结构之链表相关知识总结
2021/06/18 Java/Android
Mysql中常用的join连接方式
2022/05/11 MySQL