javascript - 全局 onclick 处理程序与每个元素事件处理程序
问题描述
考虑这个例子:
您正在创建一个使用客户端渲染的网站。当用户单击链接时,您希望禁用浏览器的导航并自己呈现新页面。
也许你也有一些这样的html,并且你想在upvote_post(id)
每次点击按钮时调用:
<post-element data-id=12345>
...
<upvote-button></upvote-button>
</post-element>
处理这两种情况的常用方法是在您生成的每个 、 等元素上添加一个事件处理click
程序。<a>
<upvote-button>
但是在文档本身上添加一个事件处理程序不是更好吗?
document.addEventListener('click', function(e) {
for (let elem of e.path) {
if (elem instanceof HTMLAnchorElement && elem.origin==window.location.origin) {
e.preventDefault()
render_page(elem.href)
break
} else if (elem.tagName=='UPVOTE-BUTTON') {
let post = elem.closest('post-element')
upvote_post(post.dataset.id)
break
}
}
})
当然,绕过内置事件处理程序系统感觉不对,但我想不出这里有什么缺点。
如果需要,您仍然可以将事件处理程序添加到特定元素,但对于常见操作,这似乎是一个更好的解决方案。
解决方案
推荐阅读
- android - 由于 Intent Service 已被弃用,如何在 kotlin 中使用 Job Intent Service 编写此代码?
- flutter - Flutter/Dart:get_cli 向页面添加更多控制器
- flutter - 当我尝试再次登录时,我收到此错误:- 在 null 上调用了 getter 'uid'
- java - 我想更改 Java Swagger 中的 http 标头 User-Agent。请帮我
- python - odoo 14 如何获取用户硬件信息进行健康监测
- python - Django AbstractBaseUser Authentication-Login
- spring-boot - 使用 Spring Boot 在模式注册表中注册模式
- java - 如何将以下类型的复杂json响应映射到java模型类
- flutter - 带有 CupertinoTabView 的 CustomScrollView 导致列表实体被覆盖
- javascript - vue 单选框返回字符串而不是布尔值