原生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 相关文章推荐
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
Dec 27 Javascript
jQuery Tools Dateinput使用介绍
Jul 14 Javascript
javascript的switch用法注意事项分析
Feb 02 Javascript
JavaScript中原型和原型链详解
Feb 11 Javascript
详解JavaScript中的forEach()方法的使用
Jun 08 Javascript
详解React 16 中的异常处理
Jul 28 Javascript
js判断文件类型大小并给出提示的实现方法
Jan 03 Javascript
Angular父子组件通过服务传参的示例方法
Oct 31 Javascript
angular 实现下拉列表组件的示例代码
Mar 09 Javascript
JavaScript中判断为整数的多种方式及保留两位小数的方法
Sep 09 Javascript
微信小程序间使用navigator跳转传值问题实例分析
Mar 27 Javascript
JS前端使用canvas实现扩展物体类和事件派发
Aug 05 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
PHP的范围解析操作符(::)的含义分析说明
2011/07/03 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
2011/08/23 PHP
我整理的PHP 7.0主要新特性
2016/01/07 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
浏览器无法运行JAVA脚本的解决方法
2008/01/09 Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
2013/05/07 Javascript
js格式化货币数据实现代码
2013/09/04 Javascript
Angular用来控制元素的展示与否的原生指令介绍
2015/01/07 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
Jquery ajax加载等待执行结束再继续执行下面代码操作
2015/11/24 Javascript
利用原生JS自动生成文章标题树的实例
2016/08/22 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
微信小程序实现图片上传
2019/05/23 Javascript
JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记
2020/07/15 Javascript
Flexible.js可伸缩布局实现方法详解
2020/11/13 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
2021/01/20 Vue.js
pytyon 带有重复的全排列
2013/08/13 Python
详解Django中Request对象的相关用法
2015/07/17 Python
轻松掌握python设计模式之策略模式
2016/11/18 Python
Python字符编码与函数的基本使用方法
2017/09/30 Python
对Python3.6 IDLE常用快捷键介绍
2018/07/16 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
python 修改本地网络配置的方法
2019/08/14 Python
Python3 读取Word文件方式
2020/02/13 Python
Python实现检测文件的MD5值来查找重复文件案例
2020/03/12 Python
HSRP的含义以及如何工作
2014/09/10 面试题
餐饮加盟计划书
2014/01/10 职场文书
父亲追悼会答谢词
2014/01/17 职场文书
计划生育宣传标语
2014/06/21 职场文书
新文化运动的口号
2014/06/21 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
法人代表证明书范本
2015/06/18 职场文书
2015教师个人师德工作总结
2015/10/23 职场文书
预防职务犯罪警示教育心得体会
2016/01/15 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书
Python中os模块的简单使用及重命名操作
2021/04/17 Python