directives.js 917 B

12345678910111213141516171819202122232425262728293031323334
  1. import Vue from "vue";
  2. // Todo: replace by https://vuetifyjs.com/en/directives/click-outside/
  3. /**
  4. * Register a specific event: v-click-out
  5. *
  6. * Example for some modale div:
  7. *
  8. * <template>
  9. * <div v-click-out="onClickOutside">
  10. * <slot></slot>
  11. * </div>
  12. * </template>
  13. *
  14. * <script>
  15. * setup() {
  16. * const show: Ref<Boolean> = ref(true)
  17. * const onClickOutside = (e: any) => { show.value = false }
  18. * }
  19. * </script>
  20. */
  21. Vue.directive("click-out", {
  22. bind: function (el, binding, vnode) {
  23. el.clickOutsideEvent = (event) => {
  24. if (!(el === event.target || el.contains(event.target))) {
  25. if(vnode.context[binding.expression])
  26. vnode.context[binding.expression](event)
  27. }
  28. };
  29. document.body.addEventListener("click", el.clickOutsideEvent);
  30. },
  31. unbind(el) {
  32. document.body.removeEventListener("click", el.clickOutsideEvent);
  33. },
  34. });