原生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 相关文章推荐
服务器安全设置的几个注册表设置
Jul 28 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
Jun 20 Javascript
jQuery实现高亮显示的方法
Mar 10 Javascript
js设置document.domain实现跨域的注意点分析
May 21 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
Jul 07 Javascript
第一次接触神奇的前端框架vue.js
Dec 01 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
Dec 31 Javascript
vue单文件组件lint error自动fix与styleLint报错自动fix详解
Jan 08 Javascript
详解element-ui中el-select的默认选择项问题
Aug 02 Javascript
让mocha支持ES6模块的方法实现
Jan 14 Javascript
React Ant Design树形表格的复杂增删改操作
Nov 02 Javascript
element中Steps步骤条和Tabs标签页关联的解决
Dec 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
德生PL330测评
2021/03/02 无线电
一个MYSQL操作类
2006/11/16 PHP
PHP中for循环语句的几种变型
2007/03/16 PHP
php 数组的合并、拆分、区别取值函数集
2010/02/15 PHP
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
2011/12/16 PHP
PHP Smarty模版简单使用方法
2016/03/30 PHP
php生成无限栏目树
2017/03/16 PHP
JSON 学习之完全手册 图文
2007/05/29 Javascript
Jquery乱码的一次解决过程 图解教程
2010/02/20 Javascript
JavaScript经典效果集锦
2010/07/06 Javascript
js 处理数组重复元素示例代码
2013/12/27 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
2015/12/04 Javascript
基于JS实现发送短信验证码后的倒计时功能(无视页面刷新,页面关闭不进行倒计时功能)
2016/09/02 Javascript
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
2018/10/22 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
Vertx基于EventBus发送接受自定义对象
2020/11/16 Javascript
Python中selenium实现文件上传所有方法整理总结
2017/04/01 Python
初探利用Python进行图文识别(OCR)
2019/02/26 Python
Python lambda表达式filter、map、reduce函数用法解析
2019/09/11 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
Marks & Spencer爱尔兰:英国马莎百货
2016/04/20 全球购物
Burberry英国官网:英国标志性奢侈品牌
2017/03/29 全球购物
Parts Express:音频、视频和扬声器的第一来源
2017/04/25 全球购物
黑猩猩商店:The Chimp Store
2020/02/12 全球购物
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
局域网标准
2016/09/10 面试题
委托协议书范本
2014/04/22 职场文书
优秀毕业生求职信
2014/06/05 职场文书
国庆节新闻稿
2015/07/17 职场文书
2019个人工作总结
2019/06/21 职场文书
一文教你快速生成MySQL数据库关系图
2022/06/28 Redis
MySQL索引失效场景及解决方案
2022/07/23 MySQL