我怎样才能检测到元素外的点击?我在用Vue.所以它将超出我的模板元素.我知道如何在Vanilla JS中做到这一点,但我不确定在使用Vue时是否有更合适的方法.js?

这是香草JS:Javascript Detect Click event outside of div的解决方案

我想我可以用更好的方式访问元素?

推荐答案

请注意,此解决方案仅适用于Vue 1.

可以通过设置一次自定义指令来很好地解决:

Vue.directive('click-outside', {
  bind () {
      this.event = event => this.vm.$emit(this.expression, event)
      this.el.addEventListener('click', this.stopProp)
      document.body.addEventListener('click', this.event)
  },   
  unbind() {
    this.el.removeEventListener('click', this.stopProp)
    document.body.removeEventListener('click', this.event)
  },

  stopProp(event) { event.stopPropagation() }
})

Usage:

<div v-click-outside="nameOfCustomEventToCall">
  Some content
</div>

在组件中:

events: {
  nameOfCustomEventToCall: function (event) {
    // do something - probably hide the dropdown menu / modal etc.
  }
}

在JSFIDLE上进行演示,并提供有关注意事项的其他信息:

https://jsfiddle.net/Linusborg/yzm8t8jq/

Vue.js相关问答推荐

如何在Vue 3中将动态特性从主零部件同步到子零部件

在 VueJS 中,将变量而不是组件的字符串名称传递给动态组件的 :is 属性不起作用

我在表格中创建了一个包含信息的新行,但在 Cypress e2e 测试中我无法获得最后一行(新行)

手动触发对观察到的对象/数组的更新

如何对对象数组进行 v-model

正确使用 Vue $refs

在 Vue 中,如何使用 npm run build 将 .htaccess 包含到生产环境中?

Vuetify 在数据表中插入操作按钮并获取行数据

v-model 不会检测到 jQuery 触发事件所做的更改

如何从 vue.js 中的自定义组件中冒泡点击事件?

VueJS 使用 prop 作为数据属性值

取消选中单选按钮

在 v-for 循环中使用 v-model

在找不到图像源时设置替代图像

VueJS 路由 - 使用子路由和 Vuetify 时如何停止多个活动路由(active routes)?

使用 axios 和 vue.js 取消先前的请求

v-if 未在计算(computed)属性上触发

用于身份验证标头的 vue-resource 拦截器

VueJS 按键查找元素

vue-cli@3 没有可用于依赖类型的模块工厂:CssDependency