【发布时间】:2019-12-07 05:09:56
【问题描述】:
当用户点击退出时,我有全局指令来隐藏模式:
Vue.directive('click-outside', {
bind(el, binding, vNode) {
el.clickOutside = event => {
if (!(el == event.target || el.contains(event.target))) {
vNode.context[binding.expression](event);
event.stopPropagation();
}
}
document.body.addEventListener('click', el.clickOutside)
},
unbind(el) {
document.removeEventListener('click', el.clickOutside)
el.clickOutside = null
}
});
接下来我使用了这个指令:
<img src="noti.png" id="1" v-click-outside="onClickOutside('notification')">
<img src="dots.png" id="2" v-click-outside="onClickOutside('profile')">
我有问题,因为我不能在一个组件上使用相同的指令。 Vue 返回我的错误:
vNode.context[binding.expression] is not a function
我找到了这个query,但答案对我没有帮助。
当将console.log 添加到指令并单击例如第一个img 指令时,将执行两次。
我如何检测(在指令中)点击了哪个img?
【问题讨论】:
-
您正在检查相反的操作 - 未点击 img。要捕获 img 点击事件,只需使用 v-on:click
-
仅供参考,你不需要做` el == event.target` 和
el.contains(event.target),你可以使用contains(),因为给定的后代会返回true包括自身的节点developer.mozilla.org/en-US/docs/Web/API/Node/contains.
标签: javascript vue.js directive