原生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 相关文章推荐
各情景下元素宽高的获取实现代码
Sep 13 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
Jul 12 Javascript
jquery网页元素拖拽插件效果及实现
Aug 05 Javascript
js换图片效果可进行定时操作
Jun 09 Javascript
基于jQuery Tipso插件实现消息提示框特效
Mar 16 Javascript
JavaScript中的原型prototype完全解析
May 10 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
Sep 05 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
Oct 26 Javascript
javascript自定义事件功能与用法实例分析
Nov 08 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
Jul 26 Javascript
Node Express用法详解【安装、使用、路由、中间件、模板引擎等】
May 13 Javascript
el-table表头根据内容自适应完美解决表头错位和固定列错位
Jan 07 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面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
PHP GD库相关图像生成和处理函数小结
2016/09/30 PHP
PHP 实现链式操作
2021/03/09 PHP
escape、encodeURI、encodeURIComponent等方法的区别比较
2006/12/27 Javascript
图片自动缩小的js代码,用以防止图片撑破页面
2007/03/12 Javascript
Apply an AutoFormat to an Excel Spreadsheet
2007/06/12 Javascript
JS生成随机字符串的多种方法
2014/06/10 Javascript
node.js操作mysql(增删改查)
2015/07/24 Javascript
javascript判断复选框是否选中的方法
2015/10/16 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
利用10行js代码实现上下滚动公告效果
2017/12/08 Javascript
详解vue-flickity的fullScreen功能实现
2020/04/07 Javascript
[01:01:04]2018DOTA2亚洲邀请赛 4.5 淘汰赛 OpTic vs TNC 第一场
2018/04/06 DOTA
Win7上搭建Cocos2d-x 3.1.1开发环境
2014/07/03 Python
Python实现分割文件及合并文件的方法
2015/07/10 Python
Python脚本处理空格的方法
2016/08/08 Python
pygame实现俄罗斯方块游戏(基础篇3)
2019/10/29 Python
Flask中endpoint的理解(小结)
2019/12/11 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
彪马英国官网:PUMA英国
2019/02/11 全球购物
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
新电JAVA笔试题目
2014/08/31 面试题
机械工程师求职自我评价
2013/09/23 职场文书
汽车驾驶求职信
2013/10/25 职场文书
预备党员党校学习自我评价分享
2013/11/12 职场文书
党员批评与自我批评
2014/02/12 职场文书
创业大赛策划书
2014/03/01 职场文书
电子商务专业自荐信
2014/06/02 职场文书
法务专员岗位职责
2015/02/14 职场文书
2015年学校关工委工作总结
2015/04/03 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书
mysql字符串截取函数小结
2021/04/05 MySQL
SpringCloud Alibaba 基本开发框架搭建过程
2021/06/13 Java/Android