Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

167
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda