Vue

by Alex Kyriakidis

HTML

<div id="app">
  <h2>Click Outside</h2>
  <div class="box" v-click-outside="clickedOutside">
    Here is some text
  </div>
</div>

CSS

body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

#app {
  background: #fff;
  border-radius: 4px;
  padding: 20px;
  transition: all 0.2s;
}

li {
  margin: 8px 0;
}

h2 {
  font-weight: bold;
  margin-bottom: 15px;
}

del {
  color: rgba(0, 0, 0, 0.3);
}

.box {
  border: 2px solid purple;
  width: 200px;
  height: 100px;
}

Vue

Vue.directive('click-outside', {
  bind (el, binding) {
    el.__ClickOutsideHandler__ = event => {
      // check if event's target is the el or contained by el
      if (!(el === event.target || el.contains(event.target))) {
        binding.value(event)
      }
    }
    document.body.addEventListener('click', el.__ClickOutsideHandler__)
  },
  unbind (el) {
    document.body.removeEventListener('click', el.__ClickOutsideHandler__)
  }
})

new Vue({
  el: "#app",
  data: {},
  methods: {
  	clickedOutside () {
    	console.log('aaa')
    	alert('you clicked outside 👏')
    }
  }
})