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

122
Vistas
¿Por qué la activación de click() dentro de un detector de eventos de clic no provoca un bucle infinito?

¿Alguien puede explicar el flujo del programa de este código JavaScript?

 const $leaveRoom = document.querySelector('#leave-button'); let a = 1; $leaveRoom.addEventListener('click', () => { console.log(a); console.log("check"); a++; $leaveRoom.click(); console.log(a); a++; });
 <button id="leave-button">Leave Room</button>

 The Output was: 1 check 2 check 3 4

Esta pregunta puede sonar tonta, pero soy nuevo en JavaScript. No puedo entender el flujo del programa de este código. Quiero saber cómo obtuve 3 y 4 en la salida.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

La clave de esta pregunta es la presencia de una bandera oculta en cada método element.click() .

Cada elemento tiene un indicador de clic en progreso asociado, que inicialmente no está configurado.

el documento: https://html.spec.whatwg.org/multipage/interaction.html#dom-click

Tan pronto como se activa este método, este indicador cambia de Estado de progess Status == unset a progess Status == active (pseudocódigo)

(luego vuelve a su estado inicial una vez que el código que contiene se ejecuta completamente)

Cuando este indicador está en estado active , se ignora cualquier llamada a este método.


Aquí está mi publicación original para mostrar la secuencia de ejecución de `console.log ()`

 const bt_leaveRoom = document.querySelector('#leave-button') var counter = 0 var origin = 'event clic' bt_leaveRoom.addEventListener('click', () => { let source = origin console.log(`_first console.log(): counter = ${ ++counter }, origin = ${source}`) origin = 'call' bt_leaveRoom.click() console.log(`second console.log(): counter = ${ ++counter }, origin = ${source}`) })
 <button id="leave-button">Leave Room</button>

la bandera oculta actúa de la misma manera si he codificado de esta manera:
reemplaza esta línea:
bt_leaveRoom.click()
para:
if (source !== 'call') bt_leaveRoom.click()

Pero, de hecho, el sistema usa el método de indicador oculto (¿llamado progress flag ?)
que puede ser (en pseudocódigo)

 if (progress_flag_of_bt_leaveRoom.click() is unset) do { bt_leaveRoom.click() }
over 4 years ago · Santiago Trujillo Denunciar

0

Intenté un par de cosas para encontrar una respuesta a esta pregunta. Realmente no he encontrado una respuesta definitiva a lo que está pasando aquí, pero creo que lo que comparto aquí alimenta este excelente problema.

Simplifiqué el código para centrarme en la activación recursiva de eventos.

Código simplificado

 const $leaveRoom = document.querySelector('#leave-button'); let a = 1; $leaveRoom.addEventListener('click', () => { console.log(a++); $leaveRoom.click(); });
 <button id="leave-button">Leave Room</button>

Podemos ver aquí que tenemos dos llamadas para console.log , la primera es para hacer clic en el botón y la segunda es para la llamada a $leaveRoom.click(); . Parece detenerse allí por alguna razón.

Uso dispatchEvent

 const $leaveRoom = document.querySelector('#leave-button'); let a = 1; $leaveRoom.addEventListener('click', () => { console.log(a++); $leaveRoom.dispatchEvent(new Event('click')); });
 <button id="leave-button">Leave Room</button>

Aquí, el evento se activa varias veces (44 para mí), esto podría deberse a la velocidad de su máquina. Sin embargo, parece que finalmente deja de activarse, así que creo que aquí también está ocurriendo el mismo fenómeno.

Usando setTimeout

 const $leaveRoom = document.querySelector('#leave-button'); let a = 1; $leaveRoom.addEventListener('click', () => { console.log(a++); setTimeout(() => { $leaveRoom.click(); }); });
 <button id="leave-button">Leave Room</button>

Si está buscando una manera de activar infinitamente el evento de clic, independientemente de por qué fallan los métodos anteriores. Esto parece hacer el truco.

Habiendo dicho todo esto, todavía no tengo idea de esta fuerza oculta que detiene la recursividad de los métodos anteriores. Tal vez alguien podría arrojar algo de luz sobre esto.

over 4 years ago · Santiago Trujillo Denunciar

0

 const click1 = document.querySelector('#click1') const click2 = document.querySelector('#click2') const click3 = document.querySelector('#click3') click1.addEventListener('click', (event) => { console.log("click1") click2.click() }); click2.addEventListener('click', (event) => { console.log("click2") click3.click() }); click3.addEventListener('click', (event) => { console.log("click3") click1.click() });
 <button id="click1">Click 1</button> <button id="click2">Click 2</button> <button id="click3">Click 3</button>

En realidad, parece que hay una lógica de ruptura de bucle en el manejo de eventos. Los controladores estarán encantados de conectar en cadena los eventos de entrada del usuario hasta que la interacción inicial envíe un evento duplicado. Entonces ya no enviará ninguno.

over 4 years ago · Santiago Trujillo 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