原生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 相关文章推荐
fancybox modal的完美解决(右上的X)
Oct 30 Javascript
javascript级联下拉列表实例代码(自写)
May 10 Javascript
JS JSON对象转为字符串的简单实现方法
Nov 18 Javascript
轻松实现javascript图片轮播特效
Jan 13 Javascript
设置jQueryUI DatePicker默认语言为中文
Jun 04 Javascript
深入理解JS正则表达式---分组
Jul 18 Javascript
详解jQuery的Cookie插件
Nov 23 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
Dec 26 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
May 08 jQuery
微信小程序 地图map实例详解
Jun 07 Javascript
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
May 29 Javascript
Nuxt使用Vuex的方法示例
Sep 06 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
ie与session丢失(新窗口cookie丢失)实测及解决方案
2013/07/15 PHP
YII中assets的使用示例
2014/07/31 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
php之可变变量的实例详解
2017/09/12 PHP
JavaScript中使用构造器创建对象无需new的情况说明
2012/03/01 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
在firefox和Chrome下关闭浏览器窗口无效的解决方法
2014/01/16 Javascript
用javascript读取xml文件读取节点数据
2014/08/12 Javascript
jquery搜索框效果实现方法
2015/01/16 Javascript
js验证上传图片的方法
2015/05/12 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
js实现对ajax请求面向对象的封装
2016/01/08 Javascript
JavaScript常用代码书写规范的超全面总结
2016/09/11 Javascript
JavaScript使用readAsDataURL读取图像文件
2017/05/10 Javascript
浅谈React + Webpack 构建打包优化
2018/01/23 Javascript
利用JS实现一个同Excel表现的智能填充算法
2018/08/13 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
2019/10/26 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
2020/02/16 Javascript
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
python文件和目录操作函数小结
2014/07/11 Python
Python中if __name__ == '__main__'作用解析
2015/06/29 Python
Python和Java进行DES加密和解密的实例
2018/01/09 Python
python写日志文件操作类与应用示例
2019/07/01 Python
python画图把时间作为横坐标的方法
2019/07/07 Python
python获取引用对象的个数方式
2019/12/20 Python
Python autoescape标签用法解析
2020/01/17 Python
tensorflow多维张量计算实例
2020/02/11 Python
Pycharm如何自动生成头文件注释
2020/11/14 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
澳大利亚新奇小玩意网站:Yellow Octopus
2017/12/28 全球购物
求职信模板怎么做
2014/01/26 职场文书
幼儿园班级工作总结2015
2015/05/25 职场文书
2015最新民情日记范文
2015/06/26 职场文书
大学优秀学生主要事迹材料
2015/11/04 职场文书
vue首次渲染全过程
2021/04/21 Vue.js