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

259
Visualizações
Vanilla JS elimina el detector de eventos en la función de curry

Tengo un problema muy "simple" de vanillaJS. ¿Cómo puedo eliminar el detector de eventos en bucle dentro de una función de curry? Este es solo un ejemplo de mi solución actual en la que realmente necesito múltiples parámetros para el oyente. Sospecho que el detector de eventos no se elimina debido a una devolución de llamada anónima si tengo razón. ¿Cómo puedo arreglar esto? Ejemplo aquí https://codepen.io/shnigi/pen/wvPwqVR

 const setEventListener = (buttons) => (event) => { const buttonValue = event.target.value; console.log('Eventlistener exists', buttonValue) buttons.forEach(button => button.removeEventListener('click', setEventListener)); }; const buttons = document.querySelectorAll('button'); buttons.forEach(button => button.addEventListener('click', setEventListener(buttons))); // Works as expected, listener is named const testbutton = document.getElementById('kek'); const testListener = () => { console.log('I show up only once'); testbutton.removeEventListener('click', testListener); }; testbutton.addEventListener('click', testListener);
 <button value="1">press me</button> <button value="2">press me</button> <button id="kek">eventlistener removed on click</button>

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Sospecho que el detector de eventos no se elimina debido a una devolución de llamada anónima si tengo razón.

Si, eso es un problema. Por lo tanto, debe asignar una función anónima a la variable y usarla para eliminar el detector de eventos.

Aquí hay un código de muestra para usted.

 const setEventListener = (buttons: NodeList) => { const returnedFunc = (event: Event) => { const buttonValue = (event.target as HTMLButtonElement).value; console.log('Eventlistener exists', buttonValue) buttons.forEach(button => button.removeEventListener('click', returnedFunc)); }; return returnedFunc; }; const buttons: Nodelist = document.querySelectorAll('button'); buttons.forEach(button => button.addEventListener('click', setEventListener(buttons))); // Works as expected, listener is named const testbutton = document.getElementById('kek'); const testListener = () => { console.log('I show up only once'); testbutton.removeEventListener('click', testListener); }; testbutton.addEventListener('click', testListener);
about 4 years ago · Juan Pablo Isaza Relatório

0

Si no le importa la compatibilidad con Internet Explorer, puede eliminar los detectores de eventos anónimos de una manera más elegante utilizando AbortController . Pase la opción de signal a addEventListener() y llame al método abort() de AbortController cuando desee eliminar el detector de eventos:

 var listenersRemover = new AbortController(); button.addEventListener('click', callback, {signal: listenersRemover.signal})); listenersRemover.abort();

Note : debe "rearmar" el controlador de cancelación para usar la misma señal para las nuevas llamadas addEventListener() . Simplemente inicialícelo nuevamente con new AbortController() .

 var listenersRemover = new AbortController(); const setEventListener = (buttons) => (event) => { const buttonValue = event.target.value; console.log('Eventlistener exists', buttonValue) // buttons.forEach(button => button.removeEventListener('click', setEventListener)); }; const buttons = document.querySelectorAll('button'); buttons.forEach(button => button.addEventListener('click', setEventListener(buttons), {signal: listenersRemover.signal})); // Works as expected, listener is named const testbutton = document.getElementById('kek'); const testListener = () => { console.log('I show up only once'); //testbutton.removeEventListener('click', testListener); listenersRemover.abort(); }; testbutton.addEventListener('click', testListener, {signal: listenersRemover.signal});
 <button value="1">press me</button> <button value="2">press me</button> <button id="kek">eventlistener removed on click</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