JavaScript原生实现事件监听及手动触发

2023-11-09

事件监听

  • 标签中的onxxx,比如<button οnclick="btnHandler">按钮</button>
  • js中的onxxx,比如document.body.onclick = function() { /* body click */ }
  • js中的addEventListener,比如document.body.addEventListener("click", () => { /* body click */ })

这三种中最好的就是最后一种了,不仅便于管理,而且可以给一个元素的任意一个事件添加多个监听器。

手动触发事件(dispatchEvent)

示例1

我们有时候会需要通过js修改表单元素的状态, 因为不是通过页面交互而是js操作的, 所以不会触发我们写的监听事件.这时就需要通过js手动触发监听事件.

jquery实现方法就是trigger('eventType')

原生实现:

<input type="checkbox" id="chk">
document.querySelector('#chk').addEventListener('change', function() {
    console.log(this.checked);
    console.log('1111');
    // 执行其他逻辑处理
    
});

如果用户手动点击多选框,可以实现多选框的选中与取消选中, 并触发监听事件.

假如多选框默认为取消选中状态, 但是经过逻辑处理之后发现需要通过js将多选框选中, 所以执行以下方法

document.getElementById('chk').checked = true;

不要通过修改多选框的checked属性来标记多选框的选中状态, 那个属性只代表多选框的默认选中状态, 如果checked="checked"表明多选框默认选中, 否则默认不选中. 其他标签的checked, selected属性也一样都代表默认选中.

通过以上的执行, 虽然页面多选框被选中了, 但是监听事件并没有被触发, 监听事件回调的一些逻辑处理就没有执行, 这会造成一些错误.我们需要手动触发监听事件.

document.querySelector('#chk').dispatchEvent(new Event('change', {
    bubbles: false, // 默认值false, 事件是否冒泡
    cancelable: false,  // 默认值false, 事件能否被取消
    composed: false  // 默认值false, 事件是否会在影子DOM根节点之外触发侦听器。
}));

这样监听事件就会触发,并且打印true和1111.

更多事件可以参考基于Event的接口,都可以使用new构造函数的方式使用。

示例2

使用customEvent来触发自定义事件并传递额外的参数。

我们使用别人写的插件时,经常看到一些自定义的事件监听,这些事件监听和普通的事件监听没什么不同,只不过是在代码执行的不同阶段触发注册的监听回调而已。

<button class="btn1">按钮1</button>
<button class="btn2" data-index="1">按钮2</button>
const btn1 = document.querySelector(".btn1");
const btn2 = document.querySelector(".btn2");
btn1.addEventListener("click", () => {
  console.log("按钮1被点击了.");
});
btn2.addEventListener("click", (e) => {
  console.log("按钮2被点击了.");
  // 原生事件的detail表示短时间内事件触发的次数
  console.log("click detail:", e.detail);
});

const target = new EventTarget();
target.addEventListener("customEvent", (e) => {
  // 自定义事件的detail表示传递的自定义参数
  console.log("customEvent detail:", e.detail);
});
// 按钮1点击, 触发自定义对象的自定义事件 customEvent
btn1.addEventListener("click", () => {
  const params = {
    a: "a",
    b: "b",
  };
  target.dispatchEvent(
    new CustomEvent("customEvent", {
      detail: {
        index: btn2.dataset.index,
        ...params,
      },
    })
  );
});

如果直接双击btn2,detail就会打印1, 2触发事件的次数。如果慢慢点击只会打印1。

如果点击btn1,detail就会打印dispatchEvent函数中传递的detail对象。

先是快速双击btn2,然后慢慢点击两次 btn2,最后点击btn1,可以看到btn1的点击事件触发了自定义对象上绑定的自定义监听事件customEvent,注意这是区分大小写的,并且传递了自定义的对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript原生实现事件监听及手动触发 的相关文章

  • 在 javascript/jquery 中将光标更改为等待

    当调用函数时 如何让光标更改为此加载图标以及如何将其更改回 javascript jquery 中的普通光标 在你的 jQuery 中使用 body css cursor progress 然后又恢复正常 body css cursor d
  • 使用 vscode 调试器调试 next.js

    我已经使用安装了一个项目创建下一个应用程序 https github com segmentio create next app 我需要使用我的编辑器 vscode 调试服务器端渲染 所以我访问过vscode recipes 如何调试 ne
  • 主干视图 DOM 元素已删除

    我一直在阅读有关 Backbone js 僵尸 或内存泄漏 问题的信息 基本上 当您不再需要该元素时 您必须从 DOM 中解除绑定并删除该元素 以确保所有事件也被删除 现在 我有一个包含几个容器的单页应用程序 div div div div
  • jquery.find() 可以只选择直接子项吗?

    我应该向 jQuery find 提供什么参数来选择元素子元素而不选择其他元素 我不能用 gt 引导选择器 而用 将选择所有后代 而不仅仅是直接子代 我知道 jQuery children 但这是一个库 因此用户能够提供自己的选择器 并且我
  • Web 串行 API - 未捕获(承诺中)DOMException:无法打开串行端口/所需成员 baudRate 未定义

    下面的代码可以在我的 Xubuntu 机器上运行 但现在我在 Kubuntu 上 它不再工作了 它不会打开端口 Arduino IDE 工作正常 可以向开发板写入代码 并且我可以在 Chrome 中选择设备 Arduino Uno 但当我尝
  • 使用模数按字母顺序对列表进行排序

    我在获取元素列表并按字母顺序对它们进行排序方面没有任何问题 但我很难理解如何使用模数来做到这一点 更新 这是按我的方式工作的代码 但是 我更喜欢下面提供的答案的可重用性 因此接受了该答案
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • Meteor:应用程序无法在 0.9.1.1 版本上运行

    出现类似错误 Error TypeError undefined is not a function evaluating Template create anonymous function iron dynamic template j
  • 除了更改标题之外,如何在 Firefox 中强制另存为对话框?

    有没有办法在 ff 中强制打开 www example com example pdf 的另存为对话框 我无法更改标题 如果您可以将文件以 Base64 格式输出到客户端 则可以使用 data uri 进行下载 location href
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • Meteor - 从客户端取消服务器方法

    我正在通过服务器方法执行数据库计数 用户可以选择他们希望如何执行计数 然后调用该方法 我的问题是 计数可能需要一些时间 并且用户可能会在方法运行时改变主意并请求不同的计数 有什么方法可以取消调用的方法并运行新的计数吗 我认为 this un
  • 将div设置为隐藏,延时后可见

    我试图在 X 时间后 也许甚至在随机时间之后 但现在我们只做固定时间 在黑色背景上出现一个黄色方块 function initialSetup if document getElementById yellow null document
  • Javascript 数组到 VBScript

    我有一个使用 Javascript 构建的对象数组 我需要使用 VBScript 读取它 如下例所示 我找不到在 VbScript 代码中循环遍历数组的方法myArray object 这个例子是我的问题的简化 我无法更改页面的默认语言 这
  • 为 illustrator 导出脚本以保存为 web jpg

    任何人都可以帮我为 illustrator CC2017 编写一个脚本 将文件以 JPG 格式导出到网络 旧版 然后保存文件并关闭 我有 700 个文件 每个文件有 2 个画板 单击 文件 gt 导出 gt 另存为 Web 旧版 然后右键文
  • 为什么在 Internet Explorer 中访问 localStorage 对象会引发错误?

    我正在解决一个客户端问题 Modernizr 意外地没有检测到对localStorageInternet Explorer 9 中的对象 我的页面正确使用 HTML 5 文档类型 并且开发人员工具报告该页面具有 IE9 的浏览器模式和 IE
  • 如何获取给定 DOM 元素的所有定义的 CSS 选择器?

    如何使用 jQuery 获取给定 DOM 元素的所有定义的 CSS 选择器 定义后 我的意思是在应用于任何样式表的所有 CSS 选择器document 在某种程度上 这类似于 FireBug 实现的功能 其中显示所选 DOM 元素的所有应用
  • Javascript转换时区问题

    我在转换当前时区的日期时间时遇到问题 我从服务器收到此日期字符串 格式为 2015 10 09T08 00 00 这是中部时间 但是当我使用 GMT 5 中的 new Date strDate 转换此日期时间时 它返回给我的信息如下 这是不
  • 如何仅在最后一个
  • 处给出透明六边形角度?
  • 我必须制作这样的菜单 替代文本 http shup com Shup 330421 1104422739 My Desktop png http shup com Shup 330421 1104422739 My Desktop png
  • 使用 Ajax 请求作为源数据的 Jquery 自动完成搜索

    我想做的事 我想使用 jquery 自动完成函数创建一个输入文本字段 该函数从跨域curl 请求获取源数据 结果应该与此示例完全相同 CSS 在这里并不重要 http abload de img jquerydblf5 png http a
  • fullCalendar 未显示正确的结束日期

    我正在看调试页面 http jsbin com wukofacaxu edit js outputFullCalendar 官方网站的 我想安排一个活动时间为 22 09 2015 至 30 09 2015 dd mm yyyy 但它只显示

随机推荐

  • PCL 间接平差法拟合二维直线

    目录 一 算法原理 二 代码实现 三 结果展示 四 相关链接 一 算法原理 通过传统最小二乘法对点云数据进行二维直线拟合时 可将误差只归因于一个方向上 本文假设误差只存在于 y y y轴方向上 设点云拟合的二维直线方程为 y
  • Java-GUI初步理解

    什么是GUI GUI既图形用户界面 是一种以图形为主体的交互方式 主要包括AWT组件以及Swing组件以及容器 布局和事件相关的类接口 AWT是抽象窗口工具包的简称 其中有像窗口 按钮等组件 而Swing是基于AWT开发的 他的功能更加强大
  • ESP32+idf开发之WIFI通信入门(2)station网络连接

    ESP32 idf开发之WIFI通信入门 2 station网络连接 1 新建工程项目ctrl shift p 选择new project 输入项目名 选择合适项目路径 选择对应的开发板 此处选择自定义 target选择ESP32 moud
  • 数据库管理员DBA

    数据库管理员DBA什么是DBA 数据库管理员 英文是Database Administrator 简称DBA 这个职位对不同的人意味着不同的意义 一个小的软件开发工作室和一个分工高度明细的大公司相比 DBA的职责来得更加宽泛一些 一个公司
  • JVM-垃圾收集算法

    目录 1 分代收集理论 2 标记 清除算法 3 标记 复制算法 4 标记 整理算法 1 分代收集理论 分代思想也很简单 就是根据对象的生命周期将内存划分 然后进行分区管理 当前商业虚拟机的垃圾收集器大多数都遵循了 分代收集 Generati
  • 登录工程三:现代Web应用中的身份验证实践

    登录系统 首先 我们要为 登录 做一个简要的定义 令后续的讲述更准确 之前的两篇文章有意无意地混淆了 登录 与 身份验证 的说法 因为在本篇之前 不少 传统Web应用 都将对身份的识别看作整个登录的过程 很少出现像企业应用环境中那样复杂的情
  • 2023华为OD机试真题【开租建站】

    题目 当前IT部门支撑了子公司颗粒化业务 该部门需要实现为子公司快速开租建站的能力 建站是指在一个全新的环境部署一套IT服务 每个站点开站会由一系列部署任务项构成 每个任务项部署完成时间都是固定和相等的 设为1 部署任务项之间可能存在依赖
  • Excel:Excel中对特殊字符的转义和处理

    对引号转义 excel公式中用两个引号代表一个引号 abc abc 会得到abc abc abc 会得到字符串 abc 处理换行符 公式中如果需要字符串换行 这样写 换 CHAR 10 行 在单元格里输入换行符 用Alt Enter输入 在
  • pywinauto 使用

    Pywinauto是基于Python开发的 用于自动化测试的脚本模块 主要操作于Windows标准图形界面 它可以允许你很容易的发送鼠标 键盘动作给Windows的对话框和控件 其中 最主要功能为对windows标准控件的一系列动作可编程处
  • tiny-cnn执行过程分析(MNIST)

    在http blog csdn net fengbingchun article details 50573841中以MNIST为例对tiny cnn的使用进行了介绍 下面对其执行过程进行分析 支持两种损失函数 1 mean squared
  • JWT介绍

    JWT介绍 1 1 jwt原则 最简单理解 jwt本质就是 把用户信息通过加密后生成的一个字符串 JWT的原则是在服务器身份验证之后 将生成一个JSON对象并将其发送回用户 UserName Chongchong Role Admin Ex
  • Ubuntu安装scrapy

    先检查是否安装过lxml openSSL 没有的话 得安装依赖包了 安装lxml 参考官网安装 http lxml de installation html 如果python是2 x的 用以下命令 sudo apt get install
  • unity 动画控制

    播放控制 Animator animator animator speed 0 停止播放 animator speed 1 倒放 animator Play stateName 0 0 播放指定状态 stateName是Animator窗口
  • 使用opencv画一些几何形状:cv2.line(),cv2.circle(),cv2.rectangle(),cv2.putText()

    1 cv2 line 划线 cv2 line img 10 10 510 510 0 255 0 5 img 图像 起点坐标 终点坐标 颜色 线的宽度 2 cv2 circle 画圆 cv2 circle img 50 50 10 0 0
  • css自学框架之图片懒加载

    首先解释一下什么叫图片懒加载 图片懒加载是一种在页面加载时 延迟加载图片资源的技术 也就是说图片资源在需要的时候才会加载 就是在屏幕显示范围内加载图片 屏幕显示范围外图片不加载 一 关键函数 用到的关键函数 globalThis Inter
  • 我是废物...

    我是废物
  • 【数据手册】CH340G芯片使用介绍

    1 概述 CH340是一系列USB总线适配器 它通过USB总线提供串行 并行或IrDA接口 CH340G集成电路提供通用的MODEM信号 允许将UART添加到计算机上 或将现有的UART设备转换为USB接口 2 特征 全速USB接口 兼容U
  • Bugku-CTF (web 持续更新) ——新手ctf记录

    目录 1 滑稽 2 计算器 3 GET 4 POST GET和POST的区别 5 矛盾 6 alert 7 你必须让他停下 8 game1 9 网站被黑 10 本地管理员 X Forwarded For 11 eval 12 变量1 13
  • Linux下的bochs安装

    强烈建议使用ubuntu系统 apt get指令太好用了 安装各种依赖相当简单 1 首先到bochs网站上下载一个linux版本bochs 在安装之前需要安装一些依赖 sudo apt get install build essential
  • JavaScript原生实现事件监听及手动触发

    事件监听 标签中的onxxx 比如