原生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 相关文章推荐
获取Javscript执行函数名称的方法
Dec 22 Javascript
jquery解析XML字符串和XML文件的方法说明
Feb 21 Javascript
Node.js模块加载详解
Aug 16 Javascript
JavaScript实现关键字高亮功能
Nov 12 Javascript
实用又漂亮的BootstrapValidator表单验证插件
May 30 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
Mar 03 Javascript
你可能不知道的JSON.stringify()详解
Aug 17 Javascript
javascript代码优化的8点总结
Jan 29 Javascript
webpack 插件html-webpack-plugin的具体使用
Apr 09 Javascript
jQuery动态移除与增加onclick属性的方法详解
Jun 07 jQuery
vue 设置路由的登录权限的方法
Jul 03 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
Aug 29 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
PHP的面试题集
2006/11/19 PHP
PHP中include与require使用方法区别详解
2013/10/19 PHP
php不写闭合标签的好处
2014/03/04 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
Aster vs Newbee BO3 第三场2.18
2021/03/10 DOTA
javascript 冒号 使用说明
2009/06/06 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
让复选框只能选择一项的方法
2013/10/08 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
JS表格组件神器bootstrap table详解(强化版)
2016/05/26 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
jQuery实现复选框的全选和反选
2017/02/02 Javascript
Node.js的特点详解
2017/02/03 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
angularjs实现搜索的关键字在正文中高亮出来
2017/06/13 Javascript
vue axios用法教程详解
2017/07/23 Javascript
vue2中使用less简易教程
2018/03/27 Javascript
浅谈Vue 自动化部署打包上线
2020/06/14 Javascript
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
[03:12]TI9战队档案 - Virtus Pro
2019/08/20 DOTA
python处理PHP数组文本文件实例
2014/09/18 Python
Python中使用pprint函数进行格式化输出的教程
2015/04/07 Python
python 字符串的驻留机制及优缺点
2020/06/19 Python
matplotlib图例legend语法及设置的方法
2020/07/28 Python
详解如何修改python中字典的键和值
2020/09/29 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
2020/11/28 Python
德国知名健康零食网上商店:Seeberger
2017/07/27 全球购物
设计模式的基本要素是什么
2014/04/21 面试题
大学生毕业自我鉴定
2013/11/06 职场文书
中专三年学习的个人自我评价
2013/12/12 职场文书
六查六看心得体会
2014/10/14 职场文书
见习报告的格式
2014/11/04 职场文书
罗马假日观后感
2015/06/08 职场文书
高一作文之乐趣
2019/11/21 职场文书