Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

161
Vistas
Verifique con un React Hook si se hace clic en algún botón HTML

Así que estoy tratando de usar un detector de eventos que activará el identificador solo si se hizo clic en cualquier botón de cualquier tipo, independientemente del contexto por el momento.

 export const useClickButtonOutside = (ref, handler) => { React.useEffect( () => { const listener = event => { // Do nothing if event is not a button if (!(event.target instanceof HTMLButtonElement)) { return; } handler(event); }; document.addEventListener('mousedown', listener); document.addEventListener('touchstart', listener, { passive: false }); return () => { document.removeEventListener('mousedown', listener); document.removeEventListener('touchstart', listener); }; }, [ref, handler] ); };

El problema principal que es difícil de lograr es:

  1. El evento puede apuntar a un elemento que contiene un botón, pero técnicamente no es una instancia del botón html. por ejemplo, hacer clic en un svg
  2. El gancho se puede aplicar a diferentes elementos del sitio web, por lo que debe ser lo más dinámico posible.
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Para lograr esto, debe observar la ruta del evento, que contendrá todos los elementos donde se disparó el evento. Debe verificar si esta cadena contiene un elemento de botón, si lo tiene, luego maneje el evento.

 export const useClickButtonOutside = (ref, handler) => { React.useEffect(() => { const listener = (event) => { // Do nothing if path contains a button let isButton = false; event.path.forEach((element) => { if (element.tagName === "BUTTON") { isButton = true; return; } }); if (!isButton) { return; } handler(event); }; document.addEventListener("mousedown", listener); document.addEventListener("touchstart", listener, { passive: false }); return () => { document.removeEventListener("mousedown", listener); document.removeEventListener("touchstart", listener); }; }, [ref, handler]); };
about 4 years ago · Juan Pablo Isaza Denunciar

0

¿Puedes explicar más sobre el segundo punto?

Sobre el primero, cuando hace clic en un botón que tiene un elemento dentro, puede recibir el elemento interior en lugar de un botón.

Por ejemplo:

 document.querySelector('button').addEventListener('click', e => { console.log(e.target); });
 <button> <span>Test</span> </button>

Eso es porque en realidad hizo clic en el lapso en lugar del botón, el botón recibe el evento debido a la propagación del evento.

Para obtener el elemento puedes hacer esto:

 document.querySelector('button').addEventListener('click', e => { console.log(e.target.closest('button')); });
 <button> <span>Test</span> </button>

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda