【发布时间】:2020-11-28 16:13:31
【问题描述】:
我们正在使用单个文件 vue 组件,并且在 mousemove 事件处理程序中,我们希望能够检测目标元素是否可点击。
在我们的 Vue 模板中,我们使用 v-on 指令:v-on:click="someCallback"。
不幸的是,似乎没有一种简单的方法来判断给定元素是否注册了事件侦听器(即通过 v-on 指令)。
为此,我们希望使用 v-on:click 指令为这些元素添加自定义属性 - 即“可点击”。但这应该会自动发生。
所以我们必须要么将 Vue 自己的“on”指令包装到自定义指令中,要么以某种方式挂钩到 Vue 的渲染周期——但这似乎不是很直接:在 Vue 实例上找不到指令或Vue 组件对象。
我们尝试过的:
- 从传递给事件处理程序的事件对象提供的目标元素中检索有关已注册侦听器的信息。但显然浏览器不提供此信息。
- 在 Vue 组件对象中搜索某个对象,该对象存储有关哪个事件侦听器已为哪个元素注册到哪个处理程序的信息。我们无法找到此信息 - 但它应该在某个地方,对吧?
希望有人对如何使用 v-on:click 指令自动完成向元素添加自定义属性有一个很好的想法。
谢谢!
编辑:
所以我们有,即
<div id="x" @click="someMethod" />
在我们的模板中。
但是我们想自动添加一个自定义属性(我们不想为所有万亿情况手动添加它):
<div id="x" clickable @click="someMethod" />
然后在 addEventListener('mousemove', handler) 的事件处理程序中,我们将检查这个属性:if (e.target.hasAttribute('clickable'))
但是任何其他实现这一点的方法(因此能够在 mousemove 的处理程序内部判断元素是否可点击)也可以。
【问题讨论】:
-
你能展示一个你想要实现的用例吗?因为它可能取决于您拥有什么、您正在使用的数据等。想想看,使用自定义
directive和refs应该可以解决问题。但正如我提到的,请发布一些示例代码。 -
在底部添加了更多细节(编辑)
标签: javascript vue.js vuejs2 event-handling