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 ...
随机推荐
- Django之CBV装饰器,跨站请求伪造,auth认证
CBV加装饰器 基于session实现登录 def login(request): if request.method == 'POST': username = request.POST.get(' ...
- django 之 Ajax and so on
MTV与MVC(了解)
- 配置ssh免密登录遇到的问题——使用VMware多虚拟机搭建Hadoop集群
搭建环境: 虚拟机 VMware12Pro 操作系统 centos6.8 hadoop 1.2.1 1.导入镜像文件,添加java环境 1.查看当前系统中安装的java,ls ...
- cookie sessionStorage localStorage 使用小结
1.cookie 随http 一起发送 2.webStorage 客户端本地存储功能 可以在客户端 本地建立 一个数据库 不参与与服务器的通讯 setItem (key, value) —— 保存 ...
- git的cd命令
这个命令是进入某个文件夹的命令.进入文件夹后可以对文件夹中的文件进行一系列操作.
- js 中的yield
yield是什么 yield是ES6的新关键字,使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者.它可以被认为是一个基于生成器的版本的return关键字. yield关键字实 ...
- A song for a new begining 8月26日到10月11日 第一阶段
- java web综合案例
1.采用的技术: bootstrap+jsp+servlet+三层架构(servlet,service,dao)+mysql 注意:mysql使用的是5.5版本,使用高版本会有很多问题.可以将5.5版 ...
- 403 Invalid CORS request 跨域问题
5.跨域问题 跨域:浏览器对于javascript的同源策略的限制 . 以下情况都属于跨域: 跨域原因说明 示例 域名不同 www.jd.com 与 www.taobao.com 域名相同,端口不同 ...
- 如何在Linux下优雅的查询日志
做为一名合格的Java后台开发 经常需要查询线上的日志,定位线上问题 所以熟练掌握日志查询的命令 可以使你更加迅速的定位错误日志位置,及时解决问题 在此,我将介绍几个自己工作中经常使用到的日志查询命令 ...