Mendeteksi klik di luar elemen

120

Bagaimana cara mendeteksi klik di luar elemen saya? Saya menggunakan Vue.js jadi itu akan berada di luar elemen template saya. Saya tahu cara melakukannya di Vanilla JS, tetapi saya tidak yakin apakah ada cara yang lebih tepat untuk melakukannya, saat saya menggunakan Vue.js?

Ini adalah solusi untuk Vanilla JS: Javascript Detect Click event di luar div

Saya kira saya dapat menggunakan cara yang lebih baik untuk mengakses elemen?

Komunitas
sumber
Komponen Vue diisolasi. jadi mendeteksi perubahan di luar tidak mungkin dilakukan dan pola anti digunakan.
Raj Kamal
Terima kasih. Saya tidak yakin bagaimana menerapkannya dalam komponen Vue. Masih harus ada beberapa praktik terbaik untuk anti-pola?
Komponen Vue.js diisolasi, itu benar, tetapi ada metode berbeda untuk komunikasi orangtua-anak. Jadi, daripada meminta untuk mendeteksi kejadian di luar elemen, Anda harus menentukan apakah Anda ingin mendeteksi elemen di dalam komponen, dari komponen induk, dari beberapa anak, atau hubungan apa pun antara komponen
Yerko Palma
Terima kasih untuk umpan baliknya. Apakah Anda memiliki beberapa contoh atau tautan yang dapat saya tindak lanjuti?
github.com/simplesmiler/vue-clickaway dapat menyederhanakan pekerjaan Anda
Raj Kamal

Jawaban:

96

Dapat diselesaikan dengan baik dengan menyiapkan arahan khusus sekali:

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() }
})

Pemakaian:

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

Dalam komponen:

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

Bekerja Demo di JSFiddle dengan info tambahan tentang peringatan:

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

Linus Borg
sumber
3
Saya memang menggunakan vue clickaway, tetapi menurut saya solusi Anda kurang lebih sama. Terima kasih.
56
Pendekatan ini tidak berfungsi lagi di Vue.js 2. Panggilan self.vm. $ emit memberikan pesan kesalahan.
utara
3
Menggunakan @blur juga merupakan opsi dan membuatnya lebih mudah memberikan hasil yang sama: <input @ blur = "hide"> di mana hide: function () {this.isActive = false; }
Craw
1
Jawabannya harus diedit untuk menyatakan bahwa i'ts hanya untuk Vue.js 1
Stéphane Gerber
167

Ada solusi yang saya gunakan, yang didasarkan pada jawaban Linus Borg dan berfungsi dengan baik dengan vue.js 2.0.

Vue.directive('click-outside', {
  bind: function (el, binding, vnode) {
    el.clickOutsideEvent = function (event) {
      // here I check that click was outside the el and his children
      if (!(el == event.target || el.contains(event.target))) {
        // and if it did, call method provided in attribute value
        vnode.context[binding.expression](event);
      }
    };
    document.body.addEventListener('click', el.clickOutsideEvent)
  },
  unbind: function (el) {
    document.body.removeEventListener('click', el.clickOutsideEvent)
  },
});

Anda mengikatnya menggunakan v-click-outside:

<div v-click-outside="doStuff">

Ini demo kecilnya

Anda dapat menemukan beberapa info lebih lanjut tentang arahan khusus dan apa arti el, binding, vnode di https://vuejs.org/v2/guide/custom-directive.html#Directive-Hook-Arguments

Madison Sampah
sumber
8
Berhasil, tetapi di arahan Vue 2.0 tidak lagi memiliki instance, jadi ini tidak ditentukan. vuejs.org/v2/guide/migration.html#Custom-Directives-simplified . Saya tidak tahu mengapa biola ini berfungsi atau kapan penyederhanaan ini telah dilakukan. (Untuk mengatasi, ganti "ini" dengan "el" untuk mengikat acara ke elemen)
Busata
1
Ini bekerja mungkin karena jendela lewat sebagai "ini". Saya telah memperbaiki jawabannya. Terima kasih telah menunjukkan bug ini.
MadisonTrash
8
Apakah ada cara untuk mengecualikan elemen tertentu di luar? Misalnya, saya memiliki satu tombol di luar yang harus membuka elemen ini dan karena itu memicu kedua metode tidak ada yang terjadi.
Žilvinas
5
Bisakah Anda menjelaskan vnode.context [binding.expression] (event); ?
Sainath SR
1
bagaimana cara mengubah ini sehingga ekspresi dapat digunakan sebagai ganti metode dalam v-click-outside dipicu?
raphadko
50

Tambahkan tabindexatribut ke komponen Anda agar dapat difokuskan dan lakukan hal berikut:

<template>
    <div
        @focus="handleFocus"
        @focusout="handleFocusOut"
        tabindex="0"
    >
      SOME CONTENT HERE
    </div>
</template>

<script>
export default {    
    methods: {
        handleFocus() {
            // do something here
        },
        handleFocusOut() {
            // do something here
        }
    }
}
</script>
G'ofur N
sumber
4
Wah! Saya menemukan ini sebagai solusi terpendek dan paling bersih. Juga satu-satunya yang berhasil dalam kasus saya.
Matt Komarnicki
3
Hanya untuk menambahkan ini, pengaturan tabindex -1 akan menghentikan kotak sorotan muncul saat Anda mengklik elemen, tetapi masih akan memungkinkan div menjadi fokus.
Colin
1
Untuk beberapa alasan tabindex -1 tidak menyembunyikan garis luar untuk saya, jadi saya hanya menambahkan outline: none;fokus untuk elemen tersebut.
Art3mix
1
bagaimana kita bisa menerapkan ini ke navigasi samping di luar kanvas yang meluncur ke layar? Saya tidak dapat memberikan fokus sidenav kecuali diklik,
Charles Okwuagwu
1
Ini adalah cara yang paling ampuh. Terima kasih! :)
Canet Robern
23

Ada dua paket yang tersedia di komunitas untuk tugas ini (keduanya dipertahankan):

Julien Le Coupanec
sumber
8
vue-clickawaypaket memecahkan masalah saya dengan sempurna. Terima kasih
Abdalla Arbab
1
Bagaimana dengan banyak item? Setiap item dengan peristiwa klik luar akan mengaktifkan peristiwa pada setiap klik. Sangat menyenangkan ketika Anda membuat dialog dan mengerikan ketika Anda membuat galeri. Di era non-komponen kita mendengarkan klik dari dokumen dan memeriksa elemen apa yang diklik. Tapi sekarang terasa sakit.
br.
@ Julien Le Coupanec Sejauh ini, saya telah menemukan solusi ini yang terbaik! Terima kasih banyak telah membagikannya!
Manuel Abascal
7

Ini Bekerja untuk saya dengan Vue.js 2.5.2:

/**
 * Call a function when a click is detected outside of the
 * current DOM node ( AND its children )
 *
 * Example :
 *
 * <template>
 *   <div v-click-outside="onClickOutside">Hello</div>
 * </template>
 *
 * <script>
 * import clickOutside from '../../../../directives/clickOutside'
 * export default {
 *   directives: {
 *     clickOutside
 *   },
 *   data () {
 *     return {
         showDatePicker: false
 *     }
 *   },
 *   methods: {
 *     onClickOutside (event) {
 *       this.showDatePicker = false
 *     }
 *   }
 * }
 * </script>
 */
export default {
  bind: function (el, binding, vNode) {
    el.__vueClickOutside__ = event => {
      if (!el.contains(event.target)) {
        // call method provided in v-click-outside value
        vNode.context[binding.expression](event)
        event.stopPropagation()
      }
    }
    document.body.addEventListener('click', el.__vueClickOutside__)
  },
  unbind: function (el, binding, vNode) {
    // Remove Event Listeners
    document.removeEventListener('click', el.__vueClickOutside__)
    el.__vueClickOutside__ = null
  }
}
yann_yinn
sumber
Terima kasih atas contoh ini. Memeriksa ini di vue 2.6. Ada beberapa perbaikan, dalam metode pelepasan Anda harus memperbaiki beberapa masalah dengan ini (Anda lupa properti body dalam metode pelepasan): document.body.removeEventListener ('click', el .__ vueClickOutside__); jika tidak - ini akan menyebabkan beberapa event listener dibuat setelah setiap komponen dibuat kembali (penyegaran halaman);
Alexey Shabramov
7
export default {
  bind: function (el, binding, vNode) {
    // Provided expression must evaluate to a function.
    if (typeof binding.value !== 'function') {
      const compName = vNode.context.name
      let warn = `[Vue-click-outside:] provided expression '${binding.expression}' is not a function, but has to be`
      if (compName) { warn += `Found in component '${compName}'` }

      console.warn(warn)
    }
    // Define Handler and cache it on the element
    const bubble = binding.modifiers.bubble
    const handler = (e) => {
      if (bubble || (!el.contains(e.target) && el !== e.target)) {
        binding.value(e)
      }
    }
    el.__vueClickOutside__ = handler

    // add Event Listeners
    document.addEventListener('click', handler)
  },

  unbind: function (el, binding) {
    // Remove Event Listeners
    document.removeEventListener('click', el.__vueClickOutside__)
    el.__vueClickOutside__ = null

  }
}
xiaoyu2er
sumber
5

Saya telah menggabungkan semua jawaban (termasuk baris dari vue-clickaway) dan menghasilkan solusi yang cocok untuk saya:

Vue.directive('click-outside', {
    bind(el, binding, vnode) {
        var vm = vnode.context;
        var callback = binding.value;

        el.clickOutsideEvent = function (event) {
            if (!(el == event.target || el.contains(event.target))) {
                return callback.call(vm, event);
            }
        };
        document.body.addEventListener('click', el.clickOutsideEvent);
    },
    unbind(el) {
        document.body.removeEventListener('click', el.clickOutsideEvent);
    }
});

Gunakan dalam komponen:

<li v-click-outside="closeSearch">
  <!-- your component here -->
</li>
BogdanG
sumber
Hampir sama dengan jawaban @MadisonTrash di bawah ini
retrovertigo
3

Saya telah memperbarui jawaban MadisonTrash untuk mendukung Mobile Safari (yang tidak memiliki clickacara, touchendharus digunakan sebagai gantinya). Ini juga termasuk pemeriksaan sehingga acara tersebut tidak dipicu dengan menyeret di perangkat seluler.

Vue.directive('click-outside', {
    bind: function (el, binding, vnode) {
        el.eventSetDrag = function () {
            el.setAttribute('data-dragging', 'yes');
        }
        el.eventClearDrag = function () {
            el.removeAttribute('data-dragging');
        }
        el.eventOnClick = function (event) {
            var dragging = el.getAttribute('data-dragging');
            // Check that the click was outside the el and its children, and wasn't a drag
            if (!(el == event.target || el.contains(event.target)) && !dragging) {
                // call method provided in attribute value
                vnode.context[binding.expression](event);
            }
        };
        document.addEventListener('touchstart', el.eventClearDrag);
        document.addEventListener('touchmove', el.eventSetDrag);
        document.addEventListener('click', el.eventOnClick);
        document.addEventListener('touchend', el.eventOnClick);
    }, unbind: function (el) {
        document.removeEventListener('touchstart', el.eventClearDrag);
        document.removeEventListener('touchmove', el.eventSetDrag);
        document.removeEventListener('click', el.eventOnClick);
        document.removeEventListener('touchend', el.eventOnClick);
        el.removeAttribute('data-dragging');
    },
});
benrwb
sumber
3

Saya menggunakan kode ini:

tombol tampilkan-sembunyikan

 <a @click.stop="visualSwitch()"> show hide </a>

tampilkan-sembunyikan elemen

<div class="dialog-popup" v-if="visualState" @click.stop=""></div>

naskah

data () { return {
    visualState: false,
}},
methods: {
    visualSwitch() {
        this.visualState = !this.visualState;
        if (this.visualState)
            document.addEventListener('click', this.visualState);
        else
            document.removeEventListener('click', this.visualState);
    },
},

Pembaruan: hapus jam tangan; tambahkan propagasi berhenti

Pax Exterminatus
sumber
2

Saya benci fungsi tambahan jadi ... berikut adalah solusi vue yang luar biasa tanpa metode vue tambahan, hanya var

  1. membuat elemen html, mengatur kontrol dan arahan
    <p @click="popup = !popup" v-out="popup">

    <div v-if="popup">
       My awesome popup
    </div>
  1. membuat var dalam data seperti
data:{
   popup: false,
}
  1. tambahkan vue directive. -nya
Vue.directive('out', {

    bind: function (el, binding, vNode) {
        const handler = (e) => {
            if (!el.contains(e.target) && el !== e.target) {
                //and here is you toggle var. thats it
                vNode.context[binding.expression] = false
            }
        }
        el.out = handler
        document.addEventListener('click', handler)
    },

    unbind: function (el, binding) {
        document.removeEventListener('click', el.out)
        el.out = null
    }
})
Martin Prestone
sumber
2

Jika Anda secara khusus mencari klik di luar elemen tetapi masih dalam induk, Anda dapat menggunakan

<div class="parent" @click.self="onParentClick">
  <div class="child"></div>
</div>

Saya menggunakan ini untuk modal.

Andres Holguin
sumber
1

Anda dapat mendaftarkan dua pendengar acara untuk acara klik seperti ini

document.getElementById("some-area")
        .addEventListener("click", function(e){
        alert("You clicked on the area!");
        e.stopPropagation();// this will stop propagation of this event to upper level
     }
);

document.body.addEventListener("click", 
   function(e) {
           alert("You clicked outside the area!");
         }
);
saravanakumar
sumber
Terima kasih. Saya tahu ini, tapi rasanya pasti ada cara yang lebih baik untuk melakukan ini di Vue.js?
BAIK! biarkan beberapa jenius vue.js menjawab :)
saravanakumar
1
  <button 
    class="dropdown"
    @click.prevent="toggle"
    ref="toggle"
    :class="{'is-active': isActiveEl}"
  >
    Click me
  </button>

  data() {
   return {
     isActiveEl: false
   }
  }, 
  created() {
    window.addEventListener('click', this.close);
  },
  beforeDestroy() {
    window.removeEventListener('click', this.close);
  },
  methods: {
    toggle: function() {
      this.isActiveEl = !this.isActiveEl;
    },
    close(e) {
      if (!this.$refs.toggle.contains(e.target)) {
        this.isActiveEl = false;
      }
    },
  },
Dmytro Lishtvan
sumber
Terima kasih, bekerja dengan sempurna dan jika Anda hanya membutuhkannya sekali tidak perlu perpustakaan tambahan
Marian Klühspies
1

Jawaban singkatnya: Ini harus dilakukan dengan Custom Directives .

Ada banyak jawaban bagus di sini yang juga mengatakan ini, tetapi sebagian besar jawaban yang saya lihat rusak ketika Anda mulai menggunakan klik luar secara ekstensif (terutama berlapis atau dengan beberapa pengecualian). Saya telah menulis artikel tentang medium yang membahas tentang nuansa Custom Directives dan khususnya implementasi yang satu ini. Ini mungkin tidak mencakup semua kasus tepi tetapi telah menutupi semua yang saya pikirkan.

Ini akan menjelaskan beberapa binding, beberapa tingkat pengecualian elemen lainnya, dan memungkinkan penangan Anda untuk hanya mengelola "logika bisnis".

Berikut kode untuk setidaknya bagian definisi itu, lihat artikel untuk penjelasan lengkap.

var handleOutsideClick={}
const OutsideClick = {
  // this directive is run on the bind and unbind hooks
  bind (el, binding, vnode) {
    // Define the function to be called on click, filter the excludes and call the handler
    handleOutsideClick[el.id] = e => {
      e.stopPropagation()
      // extract the handler and exclude from the binding value
      const { handler, exclude } = binding.value
      // set variable to keep track of if the clicked element is in the exclude list
      let clickedOnExcludedEl = false
      // if the target element has no classes, it won't be in the exclude list skip the check
      if (e.target._prevClass !== undefined) {
        // for each exclude name check if it matches any of the target element's classes
        for (const className of exclude) {
          clickedOnExcludedEl = e.target._prevClass.includes(className)
          if (clickedOnExcludedEl) {
            break // once we have found one match, stop looking
          }
        }
      }
      // don't call the handler if our directive element contains the target element
      // or if the element was in the exclude list
      if (!(el.contains(e.target) || clickedOnExcludedEl)) {
        handler()
      }
    }
    // Register our outsideClick handler on the click/touchstart listeners
    document.addEventListener('click', handleOutsideClick[el.id])
    document.addEventListener('touchstart', handleOutsideClick[el.id])
    document.onkeydown = e => {
      //this is an option but may not work right with multiple handlers
      if (e.keyCode === 27) {
        // TODO: there are minor issues when escape is clicked right after open keeping the old target
        handleOutsideClick[el.id](e)
      }
    }
  },
  unbind () {
    // If the element that has v-outside-click is removed, unbind it from listeners
    document.removeEventListener('click', handleOutsideClick[el.id])
    document.removeEventListener('touchstart', handleOutsideClick[el.id])
    document.onkeydown = null //Note that this may not work with multiple listeners
  }
}
export default OutsideClick
Marcus Smith
sumber
1

Saya melakukannya dengan cara yang sedikit berbeda menggunakan fungsi di dalam create ().

  created() {
      window.addEventListener('click', (e) => {
        if (!this.$el.contains(e.target)){
          this.showMobileNav = false
        }
      })
  },

Dengan cara ini, jika seseorang mengklik di luar elemen, maka dalam kasus saya, navigasi seluler disembunyikan.

Semoga ini membantu!

AlmostPitt
sumber
1

Sudah ada banyak jawaban untuk pertanyaan ini, dan kebanyakan dari mereka didasarkan pada ide arahan kustom yang serupa. Masalah dengan pendekatan ini adalah seseorang harus meneruskan fungsi metode ke direktif, dan tidak bisa langsung menulis kode seperti di acara lain.

Saya membuat paket baru vue-on-clickoutyang berbeda. Lihat di:

Ini memungkinkan seseorang untuk menulis v-on:clickoutseperti acara lainnya. Misalnya, Anda bisa menulis

<div v-on:clickout="myField=value" v-on:click="myField=otherValue">...</div>

dan berhasil.

Memperbarui

vue-on-clickout sekarang mendukung Vue 3!

Mu-Tsun Tsai
sumber
0

Hanya jika ada yang mencari cara menyembunyikan modal saat mengklik di luar modal. Karena modal biasanya memiliki pembungkusnya dengan kelas modal-wrapatau apa pun yang Anda beri nama, Anda dapat meletakkannya @click="closeModal"di pembungkusnya. Dengan menggunakan penanganan kejadian yang dinyatakan dalam dokumentasi vuejs, Anda dapat memeriksa apakah target yang diklik ada di bungkusnya atau di modal.

methods: {
  closeModal(e) {
    this.event = function(event) {
      if (event.target.className == 'modal-wrap') {
        // close modal here
        this.$store.commit("catalog/hideModal");
        document.body.removeEventListener("click", this.event);
      }
    }.bind(this);
    document.body.addEventListener("click", this.event);
  },
}
<div class="modal-wrap" @click="closeModal">
  <div class="modal">
    ...
  </div>
<div>

jedi
sumber
0

Solusi @Denis Danilenko bekerja untuk saya, inilah yang saya lakukan: Dengan cara saya menggunakan VueJS CLI3 dan NuxtJS di sini dan dengan Bootstrap4, tetapi ini akan berfungsi di VueJS tanpa NuxtJS juga:

<div
    class="dropdown ml-auto"
    :class="showDropdown ? null : 'show'">
    <a 
        href="#" 
        class="nav-link" 
        role="button" 
        id="dropdownMenuLink" 
        data-toggle="dropdown" 
        aria-haspopup="true" 
        aria-expanded="false"
        @click="showDropdown = !showDropdown"
        @blur="unfocused">
        <i class="fas fa-bars"></i>
    </a>
    <div 
        class="dropdown-menu dropdown-menu-right" 
        aria-labelledby="dropdownMenuLink"
        :class="showDropdown ? null : 'show'">
        <nuxt-link class="dropdown-item" to="/contact">Contact</nuxt-link>
        <nuxt-link class="dropdown-item" to="/faq">FAQ</nuxt-link>
    </div>
</div>
export default {
    data() {
        return {
            showDropdown: true
        }
    },
    methods: {
    unfocused() {
        this.showDropdown = !this.showDropdown;
    }
  }
}
alfieindesigns
sumber
0

Anda dapat mengeluarkan peristiwa javascript asli khusus dari perintah. Buat direktif yang mengirimkan acara dari node, menggunakan node.dispatchEvent

let handleOutsideClick;
Vue.directive('out-click', {
    bind (el, binding, vnode) {

        handleOutsideClick = (e) => {
            e.stopPropagation()
            const handler = binding.value

            if (el.contains(e.target)) {
                el.dispatchEvent(new Event('out-click')) <-- HERE
            }
        }

        document.addEventListener('click', handleOutsideClick)
        document.addEventListener('touchstart', handleOutsideClick)
    },
    unbind () {
        document.removeEventListener('click', handleOutsideClick)
        document.removeEventListener('touchstart', handleOutsideClick)
    }
})

Yang bisa digunakan seperti ini

h3( v-out-click @click="$emit('show')" @out-click="$emit('hide')" )
Pedro Torchio
sumber
0

Saya membuat div di ujung badan seperti itu:

<div v-if="isPopup" class="outside" v-on:click="away()"></div>

Dimana. Di luar adalah:

.outside {
  width: 100vw;
  height: 100vh;
  position: fixed;
  top: 0px;
  left: 0px;
}

Dan away () adalah metode dalam Vue instance:

away() {
 this.isPopup = false;
}

Mudah, bekerja dengan baik.

Arnaud LiDz
sumber
0

Jika Anda memiliki komponen dengan banyak elemen di dalam elemen root, Anda dapat menggunakan solusi It just works ™ ini dengan boolean.

<template>
  <div @click="clickInside"></div>
<template>
<script>
export default {
  name: "MyComponent",
  methods: {
    clickInside() {
      this.inside = true;
      setTimeout(() => (this.inside = false), 0);
    },
    clickOutside() {
      if (this.inside) return;
      // handle outside state from here
    }
  },
  created() {
    this.__handlerRef__ = this.clickOutside.bind(this);
    document.body.addEventListener("click", this.__handlerRef__);
  },
  destroyed() {
    document.body.removeEventListener("click", this.__handlerRef__);
  },
};
</script>
A1rPun
sumber
0

Gunakan paket ini vue-click-outside

Sederhana dan andal, saat ini digunakan oleh banyak paket lain. Anda juga dapat mengurangi ukuran paket javascript dengan memanggil paket hanya di komponen yang diperlukan (lihat contoh di bawah).

npm install vue-click-outside

Penggunaan:

<template>
  <div>
    <div v-click-outside="hide" @click="toggle">Toggle</div>
    <div v-show="opened">Popup item</div>
  </div>
</template>

<script>
import ClickOutside from 'vue-click-outside'

export default {
  data () {
    return {
      opened: false
    }
  },

  methods: {
    toggle () {
      this.opened = true
    },

    hide () {
      this.opened = false
    }
  },

  mounted () {
    // prevent click outside event with popupItem.
    this.popupItem = this.$el
  },

  // do not forget this section
  directives: {
    ClickOutside
  }
}
</script>
Smit Patel
sumber
0

Jangan menemukan kembali roda, gunakan paket ini v-click-outside

snehanshu.js
sumber
Lihat jawaban saya, yang saya kira Anda akan lebih menyukainya.
Mu-Tsun Tsai
0

Anda dapat membuat komponen baru yang menangani klik luar

Vue.component('click-outside', {
  created: function () {
    document.body.addEventListener('click', (e) => {
       if (!this.$el.contains(e.target)) {
            this.$emit('clickOutside');
           
        })
  },
  template: `
    <template>
        <div>
            <slot/>
        </div>
    </template>
`
})

Dan gunakan komponen ini:

<template>
    <click-outside @clickOutside="console.log('Click outside Worked!')">
      <div> Your code...</div>
    </click-outside>
</template>
Diktator 47
sumber
-1

Seringkali orang ingin tahu apakah pengguna meninggalkan komponen root (bekerja dengan komponen level apa pun)

Vue({
  data: {},
  methods: {
    unfocused : function() {
      alert('good bye');
    }
  }
})
<template>
  <div tabindex="1" @blur="unfocused">Content inside</div>
</template>

Denis Danilenko
sumber
-1

Saya punya solusi untuk menangani menu toggle dropdown:

export default {
data() {
  return {
    dropdownOpen: false,
  }
},
methods: {
      showDropdown() {
        console.log('clicked...')
        this.dropdownOpen = !this.dropdownOpen
        // this will control show or hide the menu
        $(document).one('click.status', (e)=> {
          this.dropdownOpen = false
        })
      },
}
Nicolas S.Xu
sumber
-1

Saya menggunakan paket ini: https://www.npmjs.com/package/vue-click-outside

Ini bekerja dengan baik untuk saya

HTML:

<div class="__card-content" v-click-outside="hide" v-if="cardContentVisible">
    <div class="card-header">
        <input class="subject-input" placeholder="Subject" name=""/>
    </div>
    <div class="card-body">
        <textarea class="conversation-textarea" placeholder="Start a conversation"></textarea>
    </div>
</div>

Kode skrip saya:

import ClickOutside from 'vue-click-outside'
export default
{
    data(){
        return {
            cardContentVisible:false
        }
    },
    created()
    {
    },
    methods:
        {
            openCardContent()
            {
                this.cardContentVisible = true;
            }, hide () {
            this.cardContentVisible = false
                }
        },
    directives: {
            ClickOutside
    }
}
Murad Shukurlu
sumber