不要使用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网页关键字高亮代码
Jul 30 Javascript
javascript TextArea动态显示剩余字符
Oct 22 Javascript
Javascript基础教程之JavaScript语法
Jan 18 Javascript
Node.js抓取中文网页乱码问题和解决方法
Feb 10 Javascript
原生JavaScript编写俄罗斯方块
Mar 30 Javascript
Vue Promise的axios请求封装详解
Aug 13 Javascript
Vue+webpack+Element 兼容问题总结(小结)
Aug 16 Javascript
JavaScript JMap类定义与使用方法示例
Jan 22 Javascript
在微信小程序中使用图表的方法示例
Apr 25 Javascript
vue+element实现打印页面功能
May 20 Javascript
vue父组件给子组件的组件传值provide inject的方法
Oct 23 Javascript
JavaScript类的继承多种实现方法
May 30 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
第六节 访问属性和方法 [6]
2006/10/09 PHP
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
PHP中创建和验证哈希的简单方法实探
2015/07/06 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
2019/03/08 PHP
Javascript valueOf 使用方法
2008/12/28 Javascript
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
2011/10/29 Javascript
JQuery DataTable删除行后的页面更新利用Ajax解决
2013/05/17 Javascript
用js通过url传参把数据从一个页面传到另一个页面
2014/09/01 Javascript
jquery衣服颜色选取插件效果代码分享
2015/08/28 Javascript
JS实现slide文字框缩放伸展效果代码
2015/11/05 Javascript
javascript+HTML5自定义元素播放焦点图动画
2016/02/21 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
2016/06/06 Javascript
jQuery实现锚点向下平滑滚动特效示例
2017/08/29 jQuery
彻底理解js面向对象之继承
2018/02/04 Javascript
vue组件tabbar使用方法详解
2018/11/06 Javascript
微信小程序实现简单跑马灯效果
2020/05/26 Javascript
CKeditor富文本编辑器使用技巧之添加自定义插件的方法
2019/06/14 Javascript
小程序实现搜索框功能
2020/03/26 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
[02:19]DOTA2上海特级锦标赛 观赛指南 Spectator Guide
2016/02/04 DOTA
python调用短信猫控件实现发短信功能实例
2014/07/04 Python
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
Pandas之read_csv()读取文件跳过报错行的解决
2020/04/21 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
2020/04/24 Python
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
香港家用健身器材、运动器材及健康美容仪器专门店:FitBoxx
2019/12/05 全球购物
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2014/02/20 面试题
班组长安全生产职责
2013/12/16 职场文书
《黄山奇石》教学反思
2014/04/19 职场文书
食品安全承诺书
2014/05/22 职场文书
工作检讨书怎么写
2014/10/10 职场文书
2014年信访维稳工作总结
2014/12/08 职场文书
优秀教师事迹材料
2014/12/15 职场文书