JS 中的自定义事件和模拟事件
在 JS 中模拟事件指的是模拟 JS 中定义的一些事件,例如点击事件,键盘事件等。
自定义事件指的是创建一个自定义的,JS 中之前没有的事件。
接下来分别说一下创建这两种事件的方法。
创建自定义事件
创建自定义事件可以使用 Event 和 CustomEvent 两种方法,接下来分别做一下介绍。
1. 利用 Event
Event 用法
event = new Event(typeArg, eventInit);
typeArg:指定事件类型,传递一个字符串。这里的事件类型指的是像点击事件(click)、提交事件(submit)、加载事件(load)等等。
eventInit:可选,也可以以键值对的形式设置以下属性。
bubbles:事件是否支持冒泡,传递一个boolean类型的参数,默认值为false。
cancelable:是否可取消事件的默认行为,传递一个boolean类型的参数,默认值为false。
composed:事件是否会触发shadow DOM(阴影DOM)根节点之外的事件监听器,传递一个boolean类型的参数,默认值为false。
示例
<section id="Event">
<div id="root"></div>
<script type="text/javascript">
// 创建事件对象
const newEvent = new Event('customType', { bubbles:true,cancelable:true,composed:true })
// 获取 DOM 元素
const div = document.getElementById('root')
// 绑定事件对象
document.addEventListener('customType', () => {
alert('自定式 customType 事件执行了')
})
// 触发事件对象(真正开发中可以满足某个条件后才触发事件)
div.dispatchEvent(newEvent)
</script>
</section>

2. 利用 CustomEvent
CustomEvent() 可以像 Event() 那样使用,但它也可以在 Web Workers 中使用(与主线程分离的另一个线程),可以传递跟事件关联的相关值(detail),detail 的默认值为null,类型为any(也就是说可以传递任意类型的参数),这个值就是和事件相关联的值。
通过示例可以很明白地看出来两者的区别。
<section id="CustomEvent">
<div id="root"></div>
<script type="text/javascript">
// 创建事件对象
const newEvent = new CustomEvent('customType', {
bubbles:true,
cancelable:true,
composed:true,
detail: {
log: '我是 detail 属性中的'
}
})
// 获取 DOM 元素
const div = document.getElementById('root')
// 绑定事件对象
document.addEventListener('customType', () => {
// 打印 event.detail.log 的值
alert(`自定式 customType 事件执行了,${event.detail.log}`)
})
// 触发事件对象(真正开发中可以满足某个条件后才触发事件)
div.dispatchEvent(newEvent)
</script>
</section>

可以看到在 event 对象中会有 detail 属性,我们可以输出 detail 属性中的内容。
创建模拟事件
想要模拟用户的点击等行为,可以通过模拟事件来实现。
步骤:
1)在 document 对象上使用 createEvent() 方法创建 event 对象,这个方法接收一个创建类型的字符串,主要有下面四种。
- UIevents:一般化的 UI 事件,鼠标和键盘事件都继承自 UI 事件,DOM3 中是 UIEvent。
- MouseEvents:鼠标事件,DOM3 中是 MouseEvent。
- MutationEvents:DOM 变动事件,DOM3 中是 MutationEvent。
- HTMLEvents:HTML 事件。
使
2)初始化事件对象
在使用 document.createEvent() 创建出一个 event 对象之后,event 对象上会得到一个初始化的属性,不同类型的 Event 对象属性名不同,例如 MouseEvent 类型对应的属性就是 initMouseEvent .
3)触发事件
在实际开发中当满足一定条件后我们可以使用 DOM元素.dispatchEvent(event) 来触发事件。
接下来以模拟鼠标点击事件为例,说明一下上面的各个步骤。定义了一个 div 元素,绑定了一个 click 事件处理程序,内容是 alert('我不是用户点击的'),然后再模拟触发 click 事件,可以发现即使在用户不点击时也可以弹出 '我不是用户点击的'.
<section id="SimulateEvent">
<div id="root"></div>
<script type="text/javascript">
// 获取 DOM 元素
const div = document.getElementById('root')
// 绑定事件处理程序
div.addEventListener('click', () => {
alert('我不是用户点击的')
}, false)
// 创建鼠标事件对象
const event = document.createEvent('MouseEvents')
// 初始化事件对象
event.initMouseEvent('click', true, true, document.defaultView)
// 触发事件对象(真正开发中可以满足某个条件后才触发事件)
div.dispatchEvent(event)
</script>
</section>

从上面的结果可以看到,即使我们没有点击 div 元素,它也会执行绑定的 click 的事件处理程序,原因就在于我们通过程序模拟了点击事件。
JS 中的自定义事件和模拟事件的更多相关文章
- HTML 事件(四) 模拟事件操作
本篇主要介绍HTML DOM中事件的模拟操作. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4. ...
- 使用call、apply和bind解决js中烦人的this,事件绑定时的this和传参问题
1.什么是this 在JavaScript中this可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式,this 绑定的对象即函数执行的上下文环境(context). 为了帮助理解,让我 ...
- 解密jQuery事件核心 - 模拟事件(四)
前几章已经把最核心的实现都分解过了,这一章我们看看jQuery是如何实现事件模拟的 在Internet Explorer 8和更低,一些事件change 和 submit本身不冒泡,但jQuery修改 ...
- JS中BOM和DOM常用的事件
总结:window对象 ● window.innerHeight - 浏览器窗口的内部高度 ● window.innerWidth - 浏览器窗口的内部宽度 ● window.open() - 打开新 ...
- js中的BOM和DOM常用事件方法
笔记: window对象 ● window.innerHeight - 浏览器窗口的内部高度 ● window.innerWidth - 浏览器窗口的内部宽度 ● window.open() - 打开 ...
- 原生js中如果有多个onload事件解决方案
在一个页面中有两个JavaScript 分别都用到了window.onload 一个是:window.onload=func1,另一个是:window.onload=func2 这样就造成了一个Jav ...
- Node.js 中监听 redis key 过期事件
It is in fact possible to listen to the “expired” type keyevent notification using a subscribed clie ...
- angular JS中使用jquery datatable添加ng-click事件
'use strict'; app.controller('DataTableCtrl', function ($scope, $compile) { $scope.show = function ( ...
- jQuery 移除事件与模拟事件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
随机推荐
- 表格的删除与添加以及id的唯一性
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- webpack打包es6代码
1.简单描述一下es6的模块导入和导出的语法: //导出:export var aa = 10;export function demo(){} //不能写成:var aa = 10;export a ...
- 李飞飞团队最新论文:基于anchor关键点的类别级物体6D位姿跟踪
6-PACK: Category-level 6D Pose Tracker with Anchor-Based Keypoints 论文地址: 6-PACK: Category-level 6D P ...
- 熟悉使用Webdriver ---- 商品自动秒杀
前几天下载了Webdriver模块,经过简单的研究,发现这个模块可以做很多有意思的事情,下面我就用一个实例来理解webdriver的此处操作(完整代码在文章末尾). *浏览器:谷歌chrome浏览器 ...
- 为什么你的程序配了classpath还是找不到类
classpath简介 classpath是java程序时拥有的一个系统变量,这个变量可以通过如下方式获取 System.out.println(System.getProperty("ja ...
- AI领域:如何做优秀研究并写高水平论文?
来源:深度强化学习实验室 每个人从本科到硕士,再到博士.博士后,甚至工作以后,都会遇到做研究.写论文这个差事.论文通常是对现有工作的一个总结和展示,特别对于博士和做研究的人来说,论文则显得更加重要. ...
- python框架-Django安装使用
1.安装pip sudo apt-get install python-pip 遇到问题需要更新下语言包 sudo apt-get update 检查pip是否安装成功 pip -V 查看已安装包 p ...
- 求第 k 小:大元素
#include<bits/stdc++.h> using namespace std; void swap_t(int a[],int i,int j) { int t=a[i]; a[ ...
- HashMap中使用自定义类作为Key时,为何要重写HashCode和Equals方法
之前一直不是很理解为什么要重写HashCode和Equals方法,才只能作为键值存储在HashMap中.通过下文,可以一探究竟. 首先,如果我们直接用以下的Person类作为键,存入HashMap中, ...
- Ubuntu虚拟机查看文件,目录颜色详解
查看文件 查看Home(不是home)目录下文件: [duanyongchun@localhost ~]$ ls 查看根目录下文件: [duanyongchun@localhost ~]$ cd / ...