不要使用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 相关文章推荐
OfflineSave离线保存代码再次发布使用说明
May 23 Javascript
30个精美的jQuery幻灯片效果插件和教程
Aug 23 Javascript
浅谈Javascript鼠标和滚轮事件
Jun 27 Javascript
js window对象属性和方法相关资料整理
Nov 11 Javascript
JS拖拽组件学习使用
Jan 19 Javascript
AngularJS 避繁就简的路由
Jul 01 Javascript
AngularJS 应用身份认证的技巧总结
Nov 07 Javascript
jQuery实现自动调用和触发某个事件的方法
Nov 18 Javascript
Taro集成Redux快速上手的方法示例
Jun 21 Javascript
详解Angular6.0使用路由步骤(共7步)
Jun 29 Javascript
小程序调用微信支付的方法
Sep 26 Javascript
js和jquery判断数据类型的4种方法总结
Aug 28 jQuery
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基础知识:类与对象(2) 自动加载对象
2006/12/13 PHP
用PHP制作的意见反馈表源码
2007/03/11 PHP
javascript新手语法小结
2008/06/15 Javascript
javascript下4个跨浏览器必备的函数
2010/03/07 Javascript
Safari5中alert的无限循环BUG
2011/04/07 Javascript
JavaScript中的isXX系列是否继续使用的分析
2011/04/16 Javascript
中文路径导致unitpngfix.js不正常的解决方法
2013/06/26 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
2015/04/27 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
JavaScript中对DOM节点的访问、创建、修改、删除
2015/11/16 Javascript
AngularJS实现页面定时刷新
2017/03/14 Javascript
js模拟支付宝密码输入框
2017/04/11 Javascript
微信小程序微信支付接入开发实例详解
2017/04/12 Javascript
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
Bootstrap 3多级下拉菜单实例
2017/11/23 Javascript
解决nuxt 自定义全局方法,全局属性,全局变量的问题
2020/11/05 Javascript
Python第三方库的安装方法总结
2016/06/06 Python
Python subprocess模块详细解读
2018/01/29 Python
Python解析并读取PDF文件内容的方法
2018/05/08 Python
mac安装pytorch及系统的numpy更新方法
2018/07/26 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
详解用python写一个抽奖程序
2019/05/10 Python
python openpyxl使用方法详解
2019/07/18 Python
python读取大文件越来越慢的原因与解决
2019/08/08 Python
Python hashlib模块加密过程解析
2019/11/05 Python
Clarins娇韵诗英国官网:来自法国的天然护肤品牌
2017/04/18 全球购物
Bally巴利英国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/07 全球购物
澳大利亚美容产品及化妆品在线:Activeskin
2020/06/03 全球购物
母校寄语大全
2014/04/10 职场文书
创业培训计划书
2014/05/03 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
pytest进阶教程之fixture函数详解
2021/03/29 Python
python 通过使用Yolact训练数据集
2021/04/06 Python
详解Laravel制作API接口
2021/05/31 PHP
html form表单基础入门案例讲解
2021/07/15 HTML / CSS
python pandas 解析(读取、写入)CSV 文件的操作方法
2022/12/24 Python