¿Cómo puedo detectar un clic fuera de mi elemento? Estoy usando Vue.js, por lo que estará fuera de mi elemento de plantillas. Sé cómo hacerlo en Vanilla JS, pero no estoy seguro de si hay una forma más adecuada de hacerlo, cuando estoy usando Vue.js.
Esta es la solución para Vanilla JS: evento Javascript Detect Click fuera de div
¿Supongo que puedo usar una mejor manera de acceder al elemento?
javascript
vue.js
Comunidad
fuente
fuente
Respuestas:
Se puede resolver muy bien configurando una directiva personalizada una vez:
Uso:
En el componente:
Demostración de trabajo en JSFiddle con información adicional sobre advertencias:
https://jsfiddle.net/Linusborg/yzm8t8jq/
fuente
Existe la solución que utilicé, que se basa en la respuesta de Linus Borg y funciona bien con vue.js 2.0.
Te unes a él usando
v-click-outside
:Aquí hay una pequeña demostración
Puede encontrar más información sobre directivas personalizadas y qué significa el, binding, vnode en https://vuejs.org/v2/guide/custom-directive.html#Directive-Hook-Arguments
fuente
Agregue un
tabindex
atributo a su componente para que pueda enfocarse y haga lo siguiente:fuente
outline: none;
el foco para el elemento.Hay dos paquetes disponibles en la comunidad para esta tarea (ambos se mantienen):
fuente
vue-clickaway
El paquete resolvió mi problema perfectamente. GraciasEsto funcionó para mí con Vue.js 2.5.2:
fuente
fuente
He combinado todas las respuestas (incluida una línea de vue-clickaway) y se me ocurrió esta solución que me funciona:
Uso en componente:
fuente
He actualizado la respuesta de MadisonTrash para admitir Mobile Safari (que no tiene
click
evento,touchend
debe usarse en su lugar). Esto también incorpora una verificación para que el evento no se active al arrastrar en dispositivos móviles.fuente
Yo uso este código:
botón mostrar-ocultar
elemento mostrar-ocultar
guión
Actualización: quitar el reloj; agregar detener la propagación
fuente
Odio las funciones adicionales, así que ... aquí hay una solución de vue increíble sin métodos de vue adicionales, solo var
fuente
Si busca específicamente un clic fuera del elemento pero aún dentro del elemento principal, puede usar
Yo uso esto para modales.
fuente
Puede registrar dos detectores de eventos para eventos de clic como este
fuente
fuente
La respuesta corta: esto debe hacerse con directivas personalizadas .
Aquí hay muchas respuestas excelentes que también dicen esto, pero la mayoría de las respuestas que he visto se rompen cuando comienza a usar el clic externo de manera extensiva (especialmente en capas o con múltiples exclusiones). He escrito un artículo en el medio hablando sobre los matices de las Directivas personalizadas y específicamente la implementación de esta. Puede que no cubra todos los casos extremos, pero ha cubierto todo lo que se me ocurrió.
Esto tendrá en cuenta múltiples enlaces, múltiples niveles de exclusiones de otros elementos y permitirá que su controlador solo administre la "lógica comercial".
Aquí está el código para al menos la parte de la definición, consulte el artículo para obtener una explicación completa.
fuente
Lo hice de una manera ligeramente diferente usando una función dentro de created ().
De esta manera, si alguien hace clic fuera del elemento, en mi caso, la navegación móvil está oculta.
¡Espero que esto ayude!
fuente
Ya hay muchas respuestas a esta pregunta, y la mayoría de ellas se basan en la idea de directiva personalizada similar. El problema con este enfoque es que uno tiene que pasar una función de método a la directiva y no puede escribir código directamente como en otros eventos.
Creé un nuevo paquete
vue-on-clickout
que es diferente. Compruébalo en:Le permite a uno escribir
v-on:clickout
como cualquier otro evento. Por ejemplo, puedes escribiry funciona.
Actualizar
vue-on-clickout
ahora es compatible con Vue 3!fuente
Solo si alguien está buscando cómo ocultar modal al hacer clic fuera del modal. Dado que modal generalmente tiene su envoltorio con la clase de
modal-wrap
o cualquier cosa que le hayas llamado, puedes poner@click="closeModal"
el envoltorio. Al usar el manejo de eventos indicado en la documentación de vuejs, puede verificar si el objetivo en el que se hizo clic está en el contenedor o en el modal.fuente
Las soluciones de @Denis Danilenko funcionan para mí, esto es lo que hice: por cierto, estoy usando VueJS CLI3 y NuxtJS aquí y con Bootstrap4, pero también funcionará en VueJS sin NuxtJS:
fuente
Puede emitir un evento javascript nativo personalizado desde una directiva. Cree una directiva que distribuya un evento desde el nodo, utilizando node.dispatchEvent
Que se puede usar así
fuente
Creo un div al final del cuerpo así:
Donde .outside es:
Y away () es un método en la instancia de Vue:
Fácil, funciona bien.
fuente
Si tiene un componente con varios elementos dentro del elemento raíz, puede usar esta solución It just works ™ con un booleano.
fuente
Utilice este paquete vue-click-outside
Es simple y confiable, utilizado actualmente por muchos otros paquetes. También puede reducir el tamaño de su paquete javascript llamando al paquete solo en los componentes requeridos (vea el ejemplo a continuación).
npm install vue-click-outside
Uso:
fuente
No reinvente la rueda, use este paquete v-click-outside
fuente
Puede crear un nuevo componente que maneje el clic externo
Y usa este componente:
fuente
Con frecuencia, la gente quiere saber si el usuario deja el componente raíz (funciona con componentes de cualquier nivel)
fuente
Tengo una solución para manejar el menú desplegable de alternancia:
fuente
Estoy usando este paquete: https://www.npmjs.com/package/vue-click-outside
Funciona bien para mí
HTML:
Mis códigos de script:
fuente