javascript - 是否可以确定事件是否以编程方式触发?
问题描述
是否可以确定是否由于用户交互而触发了诸如 , 等事件input
,blur
或者change
是否使用inputElement.dispatchEvent(new Event('change'))
等以编程方式触发了事件?
我面临的问题是第三方 UI 库注册了一个事件处理程序,该处理程序侦听blur
并更改输入元素的外观,如果它是空的。blur
如果满足某些条件,我有一个自己的处理程序可以将输入清空。由于我的事件处理程序是在库之后执行的,因此库不会注意到输入现在为空,并且重新抛出模糊事件会导致无限循环。
或者向事件添加自定义属性是否安全,例如......
document.getElementById('input').addEventListener('blur', event => {
if (event.myOwnCustomProperty !== true) {
event.target.value = ''
const customEvent = new Event('blur')
customEvent.myOwnCustomProperty = true
event.target.dispatchEvent(customEvent)
}
})
<input id="input">
解决方案
您可以使用isTrusted
事件的属性来检查它是否是由用户交互触发的:
接口的
isTrusted
只读属性是当事件由用户操作生成时,以及当事件由脚本创建或修改或通过 调度时。Event
Boolean
true
false
EventTarget.dispatchEvent()
document.getElementById('input').addEventListener('blur', event => {
if (event.isTrusted) {
...
}
})
请注意,用户仍然可以手动或以编程方式从调试器触发事件,在这种情况下,您永远不会知道事件的来源。
推荐阅读
- spring-boot - Spring Boot jar - BOOT-INF 文件夹中的 META-INF
- php - 我的 sql 有问题,它说有解析错误?谁能告诉我出了什么问题
- vba - 如果 ContentControl 输入未得到答复,则为 MsgBox
- mysql - 计算过去 7 天在 mysql 中的平均时间
- flutter - Firestore 类“QuerySnapshot”没有实例方法“[]”
- php - flutter multiple postwith php api问题[已解决]
- git - GitHub 问题:提交/推送重复的 Java Spring 根文件夹到不同的存储库
- docker - Docker动态IP、Server ip白名单
- php - SQL - 将数据从一个表列复制到另一个表列
- greenplum - Greenplum 与 mysql 性能对比