在 JS 中模拟事件指的是模拟 JS 中定义的一些事件,例如点击事件,键盘事件等。

自定义事件指的是创建一个自定义的,JS 中之前没有的事件。

接下来分别说一下创建这两种事件的方法。

创建自定义事件

创建自定义事件可以使用 Event 和 CustomEvent 两种方法,接下来分别做一下介绍。

1. 利用 Event

MDN 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 中的自定义事件和模拟事件的更多相关文章

  1. HTML 事件(四) 模拟事件操作

    本篇主要介绍HTML DOM中事件的模拟操作. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4.  ...

  2. 使用call、apply和bind解决js中烦人的this,事件绑定时的this和传参问题

    1.什么是this 在JavaScript中this可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式,this 绑定的对象即函数执行的上下文环境(context). 为了帮助理解,让我 ...

  3. 解密jQuery事件核心 - 模拟事件(四)

    前几章已经把最核心的实现都分解过了,这一章我们看看jQuery是如何实现事件模拟的 在Internet Explorer 8和更低,一些事件change 和 submit本身不冒泡,但jQuery修改 ...

  4. JS中BOM和DOM常用的事件

    总结:window对象 ● window.innerHeight - 浏览器窗口的内部高度 ● window.innerWidth - 浏览器窗口的内部宽度 ● window.open() - 打开新 ...

  5. js中的BOM和DOM常用事件方法

    笔记: window对象 ● window.innerHeight - 浏览器窗口的内部高度 ● window.innerWidth - 浏览器窗口的内部宽度 ● window.open() - 打开 ...

  6. 原生js中如果有多个onload事件解决方案

    在一个页面中有两个JavaScript 分别都用到了window.onload 一个是:window.onload=func1,另一个是:window.onload=func2 这样就造成了一个Jav ...

  7. Node.js 中监听 redis key 过期事件

    It is in fact possible to listen to the “expired” type keyevent notification using a subscribed clie ...

  8. angular JS中使用jquery datatable添加ng-click事件

    'use strict'; app.controller('DataTableCtrl', function ($scope, $compile) { $scope.show = function ( ...

  9. jQuery 移除事件与模拟事件

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

随机推荐

  1. R之Shiny学习笔记

    官方教程:https://shiny.rstudio.com/tutorial/ 中文教程:http://yanping.me/shiny-tutorial/ 英文教程:https://deanatt ...

  2. 201771010111-李瑞红 实验一 软件工程准备-<构建之法-现代软件工程-基础认识和理解>

    |||||||| | :--

  3. Java ServerSocket详解

    ServerSocket 构造方法 ServerSocket serverSocket = new ServerSocket(); ServerSocket(); //无参数 ServerSocket ...

  4. 从sslyze看TLS证书的点点滴滴

    纵观眼下,https已经深入大街小巷,成为网络生活中不可或缺的一部分了.提到了https,我们又不得不想到TLS(SSL),而提到了TLS,我们又不得不提到一个让人捉摸不透的东西:TLS证书. 关于证 ...

  5. 硬货 | 手把手带你构建视频分类模型(附Python演练))

    译者 | VK 来源 | Analytics Vidhya 概述 了解如何使用计算机视觉和深度学习技术处理视频数据 我们将在Python中构建自己的视频分类模型 这是一个非常实用的视频分类教程,所以准 ...

  6. 基于zookeeper实现分布式锁和基于redis实现分布所的区别

    1,实现方式不同 zookeeper实现分布式锁:通过创建一个临时节点,创建的成功节点的服务则抢占到分布式锁,可做业务逻辑.当业务逻辑完成,连接中断,节点消失,继续下一轮的锁的抢占. redis实现分 ...

  7. iOS 内存管理:从 MRC 到 ARC 实践

    对于 iOS 程序员来说,内存管理是入门的必修课.引用计数.自动释放等概念,都是与 C 语言完全不同的. iOS 内存管理的核心是引用计数. 接触 MRC 时遇到最头疼的问题就是:为什么那么多 rel ...

  8. ubuntu查看并杀死自己之前运行的进程解决办法RuntimeError: CUDA error: out of memory

    问题描述:在跑深度学习算法的时候,发现服务器上只有自己在使用GPU,但使用GPU总是会报RuntimeError: CUDA error: out of memory,这是因为自己之前运行的进程还存在 ...

  9. thinkphp5.1中使用链式操作的坑

    1.在进行tp5->tp5.1的时候,没有想太多,直接使用之前的代码:结果在该操作中,多次调用该get方法,tp5.1的链式操作一直保持了之前的搜索条件,截图如下:(具体的代码没有展示) 2.然 ...

  10. springboot集成通用mapper详细配置

    通常,我们利用mybatis写持久层方法.要么按照传统定义mapper方法,定义xml文件的方式,全部手写.要么需要通过mybatis-generator逆向工程插件生成大量的xxxExample文件 ...