原生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 function使用心得
May 10 Javascript
IE6下出现JavaScript未结束的字符串常量错误的解决方法
Nov 21 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
Apr 02 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
Sep 06 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
Aug 22 Javascript
Javascript基础教程之变量
Jan 18 Javascript
vuex进阶知识点巩固
May 20 Javascript
vue.js内置组件之keep-alive组件使用
Jul 10 Javascript
vue+element实现图片上传及裁剪功能
Jun 29 Javascript
Vue触发input选取文件点击事件操作
Aug 07 Javascript
JavaScript 空间坐标的使用
Aug 19 Javascript
Vue图片裁剪组件实例代码
Jul 02 Vue.js
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
在PWS上安装PHP4.0正式版
2006/10/09 PHP
php基础知识:控制结构
2006/12/13 PHP
分享下php5类中三种数据类型的区别
2015/01/26 PHP
Laravel4中的Validator验证扩展用法详解
2016/07/26 PHP
PHP实现获取第一个中文首字母并进行排序的方法
2017/05/09 PHP
PHP 数组黑名单/白名单实例代码详解
2019/06/04 PHP
JavaScript语言中的Literal Syntax特性分析
2007/03/08 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
2013/01/23 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
Javascript核心读书有感之词法结构
2015/02/01 Javascript
不能不知道的10个angularjs英文学习网站
2016/03/23 Javascript
NodeJS远程代码执行
2016/08/28 NodeJs
AngularJS中一般函数参数传递用法分析
2016/11/22 Javascript
angularjs $http实现form表单提交示例
2017/06/09 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
2018/03/10 Javascript
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
微信小程序 点击切换样式scroll-view实现代码实例
2019/10/11 Javascript
原生JavaScript实现随机点名表
2021/01/14 Javascript
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
自己使用总结Python程序代码片段
2015/06/02 Python
TensorFlow深度学习之卷积神经网络CNN
2018/03/09 Python
对python .txt文件读取及数据处理方法总结
2018/04/23 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
2018/11/07 Python
ActiveMQ:使用Python访问ActiveMQ的方法
2019/01/30 Python
Python自动化导出zabbix数据并发邮件脚本
2019/08/16 Python
Python实现代码块儿折叠
2020/04/15 Python
python实现定时发送邮件
2020/12/23 Python
Shopee马来西亚:随拍即卖,最佳行动电商拍卖平台
2017/06/05 全球购物
PHP面试题及答案二
2015/05/23 面试题
医学毕业生自荐信
2013/10/11 职场文书
旷课检讨书2000字
2014/01/14 职场文书
房屋买卖协议书
2014/04/10 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android