原生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 相关文章推荐
javascript 检测浏览器类型和版本的代码
Sep 15 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
May 21 Javascript
JS 在指定数组中随机取出N个不重复的数据
Jun 10 Javascript
JQuery操作元素的css样式
Mar 09 Javascript
实例讲解js验证表单项是否为空的方法
Jan 09 Javascript
原生js的RSA和AES加密解密算法
Oct 08 Javascript
vue.js实现单选框、复选框和下拉框示例
Jul 18 Javascript
浅谈vue.js中v-for循环渲染
Jul 26 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
Sep 05 jQuery
JS错误处理与调试操作实例分析
Apr 13 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
Nov 02 Javascript
PHP 502bad gateway原因及解决方案
Nov 13 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
各种咖啡的英文名子是什么
2021/03/03 新手入门
WML,Apache,和 PHP 的介绍
2006/10/09 PHP
apache+php+mysql安装配置方法小结
2010/08/01 PHP
PHP编码规范的深入探讨
2013/06/06 PHP
Yii实现多按钮保存与提交的方法
2014/12/03 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
2016/11/16 PHP
thinkPHP框架RBAC实现原理分析
2019/02/01 PHP
一个很简单的办法实现TD的加亮效果.
2006/06/29 Javascript
js小技巧--自动隐藏红叉叉
2007/08/13 Javascript
js网页中的(运行代码)功能实现思路
2013/02/04 Javascript
jquery中交替点击事件的实现代码
2014/02/14 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
以JavaScript来实现WordPress中的二级导航菜单的方法
2015/12/14 Javascript
AngularJs表单校验功能实例代码
2017/02/09 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
webpack 开发和生产并行设置的方法
2018/11/08 Javascript
微信小程序登录按钮遮罩浮层效果的实现方法
2018/12/16 Javascript
js实现mp3录音通过websocket实时传送+简易波形图效果
2020/06/12 Javascript
简单介绍利用TK在Python下进行GUI编程的教程
2015/04/13 Python
浅谈Pycharm中的Python Console与Terminal
2019/01/17 Python
用python3 urllib破解有道翻译反爬虫机制详解
2019/08/14 Python
Python 实用技巧之利用Shell通配符做字符串匹配
2019/08/23 Python
Python+numpy实现矩阵的行列扩展方式
2019/11/29 Python
如何使用 Flask 做一个评论系统
2020/11/27 Python
python爬虫 requests-html的使用
2020/11/30 Python
python math模块的基本使用教程
2021/01/16 Python
HTML5标签小集
2011/08/02 HTML / CSS
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
德国家具、照明、家居用品网上商店:Wayfair.de
2020/02/13 全球购物
护理实习自我鉴定
2013/12/14 职场文书
护理专业大学生自我推荐信
2014/01/25 职场文书
经典英文广告词
2014/03/18 职场文书
离婚协议书范本(2014版)
2014/09/28 职场文书
学前班教学反思
2016/02/24 职场文书
Python使用BeautifulSoup4修改网页内容
2022/05/20 Python