原生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 相关文章推荐
jquery调用asp.net 页面后台的实现代码
Apr 27 Javascript
javascript修改IMG标签的src问题
Mar 28 Javascript
JavaScript实现鼠标点击后层展开效果的方法
May 13 Javascript
javascript弹出拖动窗口
Aug 11 Javascript
JS/jQuery判断DOM节点是否存在的简单方法
Nov 24 Javascript
angularjs指令之绑定策略(@、=、&)
Apr 13 Javascript
vue2.0 和 animate.css的结合使用
Dec 12 Javascript
vue中简单弹框dialog的实现方法
Feb 26 Javascript
简单明了区分escape、encodeURI和encodeURIComponent
May 26 Javascript
微信小程序Getuserinfo解决方案图解
Aug 24 Javascript
PostgreSQL Node.js实现函数计算方法示例
Feb 12 Javascript
如何基于filter实现网站整体变灰功能
Apr 17 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
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
php返回字符串中所有单词的方法
2015/03/09 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
PHP 序列化和反序列化函数实例详解
2020/07/18 PHP
JavaScript的Cookies
2008/01/16 Javascript
javascript Demo模态窗口
2009/12/06 Javascript
DOM_window对象属性之--clipboardData对象操作代码
2011/02/03 Javascript
javascript数组快速打乱重排的方法
2014/01/02 Javascript
JavaScript日期时间格式化函数分享
2014/05/05 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
2017/01/01 Javascript
微信小程序使用picker实现时间和日期选择框功能【附源码下载】
2017/12/11 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
JavaScript从原型到原型链深入理解
2019/06/03 Javascript
JS多个表单数据提交下的serialize()应用实例分析
2019/08/27 Javascript
vue实现随机验证码功能(完整代码)
2019/12/10 Javascript
JS判断浏览器类型与操作系统的方法分析
2020/04/30 Javascript
vue实现标签云效果的示例
2020/11/09 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
[48:41]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
浅谈Python用QQ邮箱发送邮件时授权码的问题
2018/01/29 Python
Python Pillow Image Invert
2019/01/22 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
Python中实现输入一个整数的案例
2020/05/03 Python
Python pytesseract验证码识别库用法解析
2020/06/29 Python
使用 HTML5 Canvas 制作水波纹效果点击图片就会触发
2014/09/15 HTML / CSS
英文自我鉴定
2013/12/10 职场文书
数学教研活动总结
2014/07/02 职场文书
普宁寺导游词
2015/02/04 职场文书
投诉信范文
2015/07/02 职场文书
2016年度优秀辅导员事迹材料
2016/02/26 职场文书
详解非极大值抑制算法之Python实现
2021/06/28 Python
浅析CSS在DevTools 中架构演变
2021/10/05 HTML / CSS