原生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 相关文章推荐
JavaScript具有类似Lambda表达式编程能力的代码(改进版)
Sep 14 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
Feb 27 Javascript
跨浏览器的事件对象介绍
Jun 27 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
Jun 19 Javascript
javascript+css3 实现动态按钮菜单特效
Feb 06 Javascript
jQuery实现调整表格单列顺序完整实例
Jun 20 Javascript
vue2中filter()的实现代码
Jul 09 Javascript
深入理解React高阶组件
Sep 28 Javascript
canvas绘制爱心的几种方法总结(推荐)
Oct 31 Javascript
JQuery扩展对象方法操作示例
Aug 21 jQuery
vue+Element-ui实现分页效果
Nov 15 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
php出现Cannot modify header information问题的解决方法大全
2008/04/09 PHP
php UTF8 文件的签名问题
2009/10/30 PHP
PHP环境中Memcache的安装和使用
2015/11/05 PHP
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
自己做的模拟模态对话框实现代码
2012/05/23 Javascript
Knockoutjs的环境搭建教程
2012/11/26 Javascript
Jquery实现弹出层分享微博插件具备动画效果
2013/04/03 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
JavaScript实现简单的数字倒计时
2015/05/15 Javascript
详解JavaScript的while循环的使用
2015/06/03 Javascript
使用vue和datatables进行表格的服务器端分页实例代码
2017/06/07 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
2018/03/12 Javascript
解决vue 路由变化页面数据不刷新的问题
2018/03/13 Javascript
浅谈jquery fullpage 插件增加头部和版权的方法
2018/03/20 jQuery
vue 组件的封装之基于axios的ajax请求方法
2018/08/11 Javascript
开发一个Parcel-vue脚手架工具(详细步骤)
2018/09/22 Javascript
vue中格式化时间过滤器代码实例
2019/04/17 Javascript
Vue.directive 实现元素scroll逻辑复用
2019/11/29 Javascript
使用Vue-scroller页面input框不能触发滑动的问题及解决方法
2020/08/08 Javascript
[38:44]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第二局
2016/02/25 DOTA
[05:43]VG.R战队教练Mikasa专访:为目标从未停止战斗
2016/08/02 DOTA
python Spyder界面无法打开的解决方法
2018/04/27 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
Tensorflow中的降维函数tf.reduce_*使用总结
2020/04/20 Python
Python ini文件常用操作方法解析
2020/04/26 Python
事业单位辞职信范文
2014/01/19 职场文书
网吧消防安全制度
2014/01/28 职场文书
财务管理专业求职信
2014/06/11 职场文书
中国梦团日活动总结
2014/07/07 职场文书
学前班学生评语
2014/12/29 职场文书
致接力运动员加油稿
2015/07/21 职场文书
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis