原生js实现trigger方法示例代码


Posted in Javascript onMay 22, 2019

前言

事件绑定成功之后,事件的执行函数就如同待字闺中的小姑娘。除了由坐在电脑前的大叔们用键盘、鼠标等硬件行为触发外,需要在代码中直接调用又该如何实现?

首先需要将事件绑定至指定DOM节点上

// 在一个节点上绑定一个事件
let test = document.createElement('div');
test.id = 'test';
test.innerHTML = '测试事件';
document.body.appendChild(test);
test.addEventListener('mousedown', function(){
  console.log('hello jTool');
}, false)

事件绑定成功之后,事件的执行函数就如同待字闺中的小姑娘。除了由坐在电脑前的大叔们用键盘、鼠标等硬件行为触发外,需要在代码中直接调用又该如何实现?在 jQuery 中的事件类中包含一个trigger方法, 我之前写的类库 jTool 中同样也实现了该方法, 下面就以 jTool 的视角来说明下 trigger 如何实现。

绑定事件时使用 DOM 对象的 .addEventListener() 方法, 而实现 trigger 则是使用 DOM 对像的 .dispatchEvent() 方法。

.dispatchEvent() 需要以参数形式传入被派发的事件对象, 该事件对象可以通过 javascript 的全局构造函数 Event。

// 触发事件
var myEvent = new Event('mousedown');
test.dispatchEvent(myEvent); // => true

接下来实现在获取的节点上直接调用 .trigger() 方法

1.为Element 增加trigger方法

Element.prototype.trigger = function(eventName){
  this.dispatchEvent(new Event(eventName));
}
let target = document.querySelector('#test'); // Element
target.trigger('mousedown'); // => 'hello jTool'

2.为 NodeList 增加 trigger 方法

target = document.querySelectorAll('#test'); // NodeList
target.trigger('mousedown'); // => Uncaught TypeError: target.trigger is not a function

如上所示 .querySelectorAll() 获取的节点, 却并未存在 .trigger() 方法, 这是由于通过 .querySelectorAll() 获取到的是 NodeList 实例而非 Element。

NodeList.prototype.trigger = function(eventName){
  [].forEach.call(this, function(item, index){
    item.dispatchEvent(new Event(eventName));
  });
}
target = document.querySelectorAll('#test'); // NodeList
target.trigger('mousedown'); // => hello jTool

而以上的方法仅限于直接绑定至 DOM 的事件,预绑定的事件,无法通过 new Event().dispatchEvent() 来执行, 且需要其它方法协同处理。

以上代码是在进行jtool类库编码时实践出来的方式,欢迎star

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
学习js所必须要知道的一些
Mar 07 Javascript
jQuery 常见开发使用技巧总结
Dec 26 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
Mar 19 Javascript
Js+php实现异步拖拽上传文件
Jun 23 Javascript
JS+CSS实现下拉列表框美化效果(3款)
Aug 15 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
Jun 17 Javascript
jQuery实现拖拽可编辑模块功能代码
Jan 12 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
Jun 17 Javascript
微信小程序实现手势图案锁屏功能
Jan 30 Javascript
JavaScript原型对象原理与应用分析
Dec 27 Javascript
JS绘图Flot如何实现动态可刷新曲线图
Oct 16 Javascript
用Javascript实现发送短信验证码间隔功能
Feb 08 Javascript
koa router 多文件引入的方法示例
May 22 #Javascript
微信小程序template模板与component组件的区别和使用详解
May 22 #Javascript
微信小程序+腾讯地图开发实现路径规划绘制
May 22 #Javascript
详解wepy开发小程序踩过的坑(小结)
May 22 #Javascript
vue项目中mock.js的使用及基本用法
May 22 #Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
May 22 #Javascript
vue以组件或者插件的形式实现throttle或者debounce
May 22 #Javascript
You might like
杏林同学录(一)
2006/10/09 PHP
8个出色的WordPress SEO插件收集
2011/02/26 PHP
安装apache2.2.22配置php5.4(具体操作步骤)
2013/06/26 PHP
浅析PHP原理之变量(Variables inside PHP)
2013/08/09 PHP
thinkPHP实现表单自动验证
2014/12/24 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
PHP asXML()函数讲解
2019/02/03 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
JS获取IUSR_机器名和IWAM_机器名帐号的密码
2006/12/06 Javascript
jQuery基础框架浅入剖析
2012/12/27 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
JS如何判断移动端访问设备并解析对应CSS
2013/11/27 Javascript
javascript日期格式化示例分享
2014/03/05 Javascript
javaScript实现滚动新闻的方法
2015/07/30 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
jquery封装插件时匿名函数形参和实参的写法解释
2017/02/14 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
2018/05/03 Javascript
JavaScript显式数据类型转换详解
2019/03/18 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
JavaScript使用setTimeout实现倒计时效果
2021/02/19 Javascript
Python中的匿名函数使用简介
2015/04/27 Python
python实现bucket排序算法实例分析
2015/05/04 Python
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
事务机电主管工作职责
2014/02/25 职场文书
基本公共卫生服务健康教育工作方案
2014/05/22 职场文书
羽毛球社团活动总结
2014/06/27 职场文书
关于保护环境的建议书
2014/08/26 职场文书
仲裁协议书
2014/09/26 职场文书
领导班子整改方案和个人整改措施
2014/10/25 职场文书
同学毕业留言寄语
2015/02/27 职场文书
语文教师求职信范文
2015/03/20 职场文书
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电
Nginx本地配置SSL访问的实例教程
2022/05/30 Servers