不要使用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 相关文章推荐
JS 获取浏览器和屏幕宽高等信息代码
Mar 31 Javascript
通过Jquery的Ajax方法读取将table转换为Json
May 31 Javascript
js style动态设置table高度
Oct 21 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
Aug 13 Javascript
javascript实现PC网页里的拖拽效果
Mar 14 Javascript
Vue.JS入门教程之处理表单
Dec 01 Javascript
Angularjs的$http异步删除数据详解及实例
Jul 27 Javascript
layui select获取自定义属性方法
Aug 15 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
Dec 21 Javascript
vue2 v-model/v-text 中使用过滤器的方法示例
May 09 Javascript
vue-cli3项目展示本地Markdown文件的方法
Jun 07 Javascript
JS/CSS实现字符串单词首字母大写功能
Sep 03 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
一个简单计数器的源代码
2006/10/09 PHP
PHP文件下载类
2006/12/06 PHP
php 页面执行时间计算代码
2008/12/04 PHP
fleaphp crud操作之findByField函数的使用方法
2011/04/23 PHP
Apache2中实现多网站域名绑定的实现方法
2011/06/01 PHP
PHP判断IP并转跳到相应城市分站的方法
2015/03/25 PHP
WordPress后台中实现图片上传功能的实例讲解
2016/01/11 PHP
PHP加密3DES报错 Call to undefined function: mcrypt_module_open() 如何解决
2016/04/17 PHP
php 数组字符串搜索array_search技巧
2016/07/05 PHP
Laravel学习教程之路由模块
2017/08/18 PHP
js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
2009/03/26 Javascript
JavaScript作用域链示例分享
2014/05/27 Javascript
教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
2014/07/23 Javascript
jQuery鼠标事件汇总
2015/08/30 Javascript
js实现图片上传并正常显示
2015/12/19 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
2017/03/03 Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
vue移动端实现下拉刷新
2018/04/22 Javascript
nodejs中用npm初始化来创建package.json的实例讲解
2018/10/10 NodeJs
vue权限问题的完美解决方案
2019/05/08 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
2019/06/07 Javascript
JavaScript工具库之Lodash详解
2019/06/15 Javascript
python实现的AES双向对称加密解密与用法分析
2017/05/02 Python
Python 逐行分割大txt文件的方法
2017/10/10 Python
python通过socket实现多个连接并实现ssh功能详解
2017/11/08 Python
在python中以相同顺序shuffle两个list的方法
2018/12/13 Python
python字典排序的方法
2019/10/12 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
Urban Decay官方网站:美国化妆品品牌
2020/06/04 全球购物
酒店管理毕业生自荐信
2013/10/24 职场文书
创建青年文明号材料
2014/05/09 职场文书
2015年度保密工作总结
2015/04/24 职场文书
2015年库房工作总结
2015/04/30 职场文书
2016教师六五普法学习心得体会
2016/01/21 职场文书