Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

vue-clickaway

simplesmiler269.9kMIT2.2.2TypeScript support: definitely-typed

Reusable clickaway directive for reusable Vue.js components

click, clickaway, reusable, vue, vue-directive, vuejs

readme

vue-clickaway

Reusable clickaway directive for reusable Vue.js components

npm version CDNJS

Overview

Sometimes you need to detect clicks outside of the element (to close a modal window or hide a dropdown select). There is no native event for that, and Vue.js does not cover you either. This is why vue-clickaway exists. Please check out the demo before reading further.

Requirements

  • vue: ^2.0.0

If you need a version for Vue 1, try `vue-clickaway@1.0`.

Install

From npm:

$ npm install vue-clickaway --save

From CDN, chose the one you prefer:

<script src="https://cdn.jsdelivr.net/npm/vue-clickaway@2.2.2/dist/vue-clickaway.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue-clickaway/2.2.2/vue-clickaway.min.js"></script>
<script src="https://cdn.rawgit.com/simplesmiler/vue-clickaway/2.2.2/dist/vue-clickaway.min.js"></script>

Usage

  1. Make the directive available to your component
  2. Define a method to be called
  3. Use the directive in the template

The recommended way is to use the mixin:

import { mixin as clickaway } from 'vue-clickaway';

export default {
  mixins: [ clickaway ],
  template: '<p v-on-clickaway="away">Click away</p>',
  methods: {
    away: function() {
      console.log('clicked away');
    },
  },
};

If mixin does not suit your needs, you can use the directive directly:

import { directive as onClickaway } from 'vue-clickaway';

export default {
  directives: {
    onClickaway: onClickaway,
  },
  template: '<p v-on-clickaway="away">Click away</p>',
  methods: {
    away: function() {
      console.log('clicked away');
    },
  },
};

Caveats

  1. Pay attention to the letter case. onClickaway turns into v-on-clickaway, while onClickAway turns into v-on-click-away.
  2. Prior to vue@^2.0, directive were able to accept statements. This is no longer the case. If you need to pass arguments, just do v-on-clickaway="() => away(arg1)".
  3. There is a common issue with dropdowns (and modals) inside an element with v-on-clickaway. Some UI libraries chose to implement these UI elements by attaching the DOM element directly to the body. This makes clicks on a dropped element trigger away handler. To combat that, you have to add an extra check in the handler, for where the event originated from. See #9 for an example.

License

MIT

changelog

2.2.2 - 2018-04-09

Changed

  • Fix context with which the away handler is called

2.2.1 - 2018-04-08

Changed

  • Fix regression, fallback to .contains if .path is not supported

2.2.0 - 2018-04-08

Changed

  • Refer to event.path instead of element.contains(event.target) for more reliable containment check (fixes #23), kudos to @jonobr1

2.1.0 - 2016-11-24

Changed

  • Away callback may not be triggered until the end of the initial macrotask (fixes #8)

2.0.0 - 2016-10-20

Breaking changes

  • Removed deprecated submodules

2.0.0-rc.1 - 2016-09-30

Reworked for Vue 2.0

Breaking changes

  • v-on-clickaway used to be able to accept statements, like v-on-clickaway="a = a + 1" or v-on-clickaway="doSomething(context)". This is no longer supported.

1.1.5 - 2016-09-30

Skipped 1.1.4 due to publishing mistake

Changed

  • Exposed version

1.1.3 - 2016-08-14

Fixed

  • CDN link
  • Build files

1.1.2 - 2016-08-14

Fixed

  • Moved vue from dependencies to peerDependencies

Changed

  • Moved from envify to loose-envify

1.1.1 - 2015-12-17

Fixed

  • CDN link

1.1.0 - 2015-12-17

Changed

  • Ported the source to es6 to make use of the rollup bundler
  • Deprecated the old import syntax in favor of the es6 module syntax
  • Introduced a build system to produce common-js module and CDN bundles
  • From now on dist will be commited to the repo to make use of rawgit CDN

1.0.1 - 2015-12-17

Changed

  • Improved docs
  • Lint script does not require globally installed eslint anymore

1.0.0 - 2015-11-11

Changed

  • Improved docs

1.0.0-rc.1 - 2015-10-28

Changed

  • Switch to Vue 1.0

0.1.1 - 2015-10-28

Fixed

  • Some files were not linted

0.1.0 - 2015-09-13

Initial release