不要使用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 相关文章推荐
jQuery对象与DOM对象之间的转换方法
Apr 15 Javascript
在线所见即所得HTML编辑器的实现原理浅析
Apr 25 Javascript
JQuery.Ajax()的data参数类型实例详解
Nov 20 Javascript
使用Bootstrap + Vue.js实现添加删除数据示例
Feb 27 Javascript
解决vue 按钮多次点击重复提交数据问题
May 10 Javascript
angular 组件通信的几种实现方式
Jul 13 Javascript
解决Vue+Element ui开发中碰到的IE问题
Sep 03 Javascript
基于Vue和Element-Ui搭建项目的方法
Sep 06 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
Nov 01 Javascript
Node.js API详解之 timer模块用法实例分析
May 07 Javascript
从表单校验看JavaScript策略模式的使用详解
Oct 17 Javascript
H5 js点击按钮复制文本到粘贴板
Nov 19 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获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
学习ExtJS accordion布局
2009/10/08 Javascript
基于jquery实现的鼠标拖拽元素复制并写入效果
2011/08/23 Javascript
基于JQuery实现鼠标点击文本框显示隐藏提示文本
2012/02/23 Javascript
Jquery 实现表格颜色交替变化鼠标移过颜色变化实例
2013/08/28 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
2013/12/09 Javascript
javascript四舍五入函数代码分享(保留后几位)
2013/12/10 Javascript
用js判断是否为360浏览器的实现代码
2015/01/15 Javascript
JavaScript从数组中删除指定值元素的方法
2015/03/18 Javascript
JS+CSS实现滑动切换tab菜单效果
2015/08/25 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
Angular 根据 service 的状态更新 directive
2016/04/03 Javascript
JS中mouseover和mouseout多次触发问题如何解决
2016/06/06 Javascript
借助node实战JSONP跨域实例
2017/03/30 Javascript
AngularJS使用拦截器实现的loading功能完整实例
2017/05/17 Javascript
详解基于webpack搭建react运行环境
2017/06/01 Javascript
vue element-ui table表格滚动加载方法
2018/03/02 Javascript
JS中‘hello’与new String(‘hello’)引出的问题详解
2018/08/14 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
2019/07/10 Javascript
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
JavaScript原型式继承实现方法
2019/11/06 Javascript
python实现socket客户端和服务端简单示例
2014/02/24 Python
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
把MySQL表结构映射为Python中的对象的教程
2015/04/07 Python
Python3之读取连接过的网络并定位的方法
2018/04/22 Python
Python3中的bytes和str类型详解
2019/05/02 Python
django的csrf实现过程详解
2019/07/26 Python
python虚拟环境完美部署教程
2019/08/06 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
2020/02/17 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
《哪吒闹海》教学反思
2014/02/28 职场文书
介绍信格式
2015/01/30 职场文书
放牛班的春天观后感
2015/06/01 职场文书
python3使用diagrams绘制架构图的步骤
2021/04/08 Python