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?
javascript
vue.js
Komunitas
sumber
sumber
Jawaban:
Dapat diselesaikan dengan baik dengan menyiapkan arahan khusus sekali:
Pemakaian:
Dalam komponen:
Bekerja Demo di JSFiddle dengan info tambahan tentang peringatan:
https://jsfiddle.net/Linusborg/yzm8t8jq/
sumber
Ada solusi yang saya gunakan, yang didasarkan pada jawaban Linus Borg dan berfungsi dengan baik dengan vue.js 2.0.
Anda mengikatnya menggunakan
v-click-outside
: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
sumber
Tambahkan
tabindex
atribut ke komponen Anda agar dapat difokuskan dan lakukan hal berikut:sumber
outline: none;
fokus untuk elemen tersebut.Ada dua paket yang tersedia di komunitas untuk tugas ini (keduanya dipertahankan):
sumber
vue-clickaway
paket memecahkan masalah saya dengan sempurna. Terima kasihIni Bekerja untuk saya dengan Vue.js 2.5.2:
sumber
sumber
Saya telah menggabungkan semua jawaban (termasuk baris dari vue-clickaway) dan menghasilkan solusi yang cocok untuk saya:
Gunakan dalam komponen:
sumber
Saya telah memperbarui jawaban MadisonTrash untuk mendukung Mobile Safari (yang tidak memiliki
click
acara,touchend
harus digunakan sebagai gantinya). Ini juga termasuk pemeriksaan sehingga acara tersebut tidak dipicu dengan menyeret di perangkat seluler.sumber
Saya menggunakan kode ini:
tombol tampilkan-sembunyikan
tampilkan-sembunyikan elemen
naskah
Pembaruan: hapus jam tangan; tambahkan propagasi berhenti
sumber
Saya benci fungsi tambahan jadi ... berikut adalah solusi vue yang luar biasa tanpa metode vue tambahan, hanya var
sumber
Jika Anda secara khusus mencari klik di luar elemen tetapi masih dalam induk, Anda dapat menggunakan
Saya menggunakan ini untuk modal.
sumber
Anda dapat mendaftarkan dua pendengar acara untuk acara klik seperti ini
sumber
sumber
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.
sumber
Saya melakukannya dengan cara yang sedikit berbeda menggunakan fungsi di dalam create ().
Dengan cara ini, jika seseorang mengklik di luar elemen, maka dalam kasus saya, navigasi seluler disembunyikan.
Semoga ini membantu!
sumber
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-clickout
yang berbeda. Lihat di:Ini memungkinkan seseorang untuk menulis
v-on:clickout
seperti acara lainnya. Misalnya, Anda bisa menulisdan berhasil.
Memperbarui
vue-on-clickout
sekarang mendukung Vue 3!sumber
Hanya jika ada yang mencari cara menyembunyikan modal saat mengklik di luar modal. Karena modal biasanya memiliki pembungkusnya dengan kelas
modal-wrap
atau 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.sumber
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:
sumber
Anda dapat mengeluarkan peristiwa javascript asli khusus dari perintah. Buat direktif yang mengirimkan acara dari node, menggunakan node.dispatchEvent
Yang bisa digunakan seperti ini
sumber
Saya membuat div di ujung badan seperti itu:
Dimana. Di luar adalah:
Dan away () adalah metode dalam Vue instance:
Mudah, bekerja dengan baik.
sumber
Jika Anda memiliki komponen dengan banyak elemen di dalam elemen root, Anda dapat menggunakan solusi It just works ™ ini dengan boolean.
sumber
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:
sumber
Jangan menemukan kembali roda, gunakan paket ini v-click-outside
sumber
Anda dapat membuat komponen baru yang menangani klik luar
Dan gunakan komponen ini:
sumber
Seringkali orang ingin tahu apakah pengguna meninggalkan komponen root (bekerja dengan komponen level apa pun)
sumber
Saya punya solusi untuk menangani menu toggle dropdown:
sumber
Saya menggunakan paket ini: https://www.npmjs.com/package/vue-click-outside
Ini bekerja dengan baik untuk saya
HTML:
Kode skrip saya:
sumber