Jquery fadeOut ejecuta la devolución de llamada una y otra vez, ¿por qué es esto y cómo puedo evitarlo?

StackOverflow https://stackoverflow.com/questions/1234154

Pregunta

Mi método desvanece un cuadro div y tiene una devolución de llamada que llama a un método ... como este:

function closeWindow(windowIdPrefix, speed) {
    $("#" + windowIdPrefix + "_ViewPanel").fadeOut(speed,
        function() {
            resetWindow(windowIdPrefix);
            numWindowsOpen--;
        }
    );
}

function resetWindow(windowIdPrefix) {
   alert("resetting window");
}

Cuando esto se ejecuta (al hacer clic en un botón) tengo una alerta en resetWindow para ver cuántas veces se ejecuta.

Parece ejecutarse para siempre, pero no me he sentado allí el tiempo suficiente para cerrar las ventanas de alerta para averiguarlo.

Investigué un poco y leí en la documentación de Jquery:

  

Función de devolución de llamada (Opcional)
  Una función que se ejecutará cada vez que se complete la animación, se ejecuta una vez para cada elemento animado contra .

Así que me preguntaba, a pesar de que solo estoy desvaneciendo 1 div, ¿cuenta como 1 .. más 1 por cada elemento secundario que tiene el div?

Técnicamente están siendo animados porque los elementos internos se están desvaneciendo con el div externo, pero si ves el javascript en firebug, solo el div externo que estoy desvaneciendo cambia su opacidad / visualización.

Si esto es lo que está sucediendo, ¿cómo me aseguro de que la devolución de llamada solo se ejecute una vez?

Editar: Era la línea numWindowsOpen--; no había definido numWindowsOpen antes de la función, por alguna razón que hacía que la llamada ocurriera varias veces ... ¿Alguien puede explicar por qué sucedía esto?

¿Fue útil?

Solución 2

El problema era que numWindowsOpen no se declaró antes de que fuera decrementado allí ... Un buen recordatorio para asegurarse de buscar cosas simples como esas antes de ir a tareas más complicadas.

Otros consejos

La devolución de llamada solo debe invocarse una vez para cada elemento que coincida con el selector. ¿Ves múltiples alertas al poner un mensaje de alerta directamente en la devolución de llamada?

function() {
    alert('Test');
    resetWindow(windowIdPrefix);
    numWindowsOpen--;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top