Jquery fadeOut выполняет обратный вызов снова и снова, почему это так и как я могу предотвратить это?
-
22-07-2019 - |
Вопрос
Мой метод выгружает блок div и имеет обратный вызов, который вызывает метод ... вот так:
function closeWindow(windowIdPrefix, speed) {
$("#" + windowIdPrefix + "_ViewPanel").fadeOut(speed,
function() {
resetWindow(windowIdPrefix);
numWindowsOpen--;
}
);
}
function resetWindow(windowIdPrefix) {
alert("resetting window");
}
Когда это выполняется (по нажатию кнопки), у меня появляется предупреждение в resetWindow, чтобы увидеть, сколько раз оно выполняется.
Кажется, это выполняется вечно, но я не сидел там достаточно долго, закрывая окна оповещений, чтобы это выяснить.
Я провел небольшое исследование и прочитал документацию по Jquery:
Функция обратного вызова(необязательно)
Функция, выполняемая при завершении анимации, выполняется один раз для каждого элемента, анимированного в отношении . Р>
Итак, мне было интересно, хотя я только затухаю 1 div, он считается как 1 .. плюс 1 для каждого дочернего элемента, который имеет div?
Технически они анимируются, потому что внутренние элементы исчезают с помощью внешнего div, но если вы смотрите javascript в firebug, то только внешний div, который я исчезаю, получает измененную прозрачность / отображение.
Если это то, что происходит, как я могу убедиться, что обратный вызов выполняется только один раз?
Edit: Это была строка numWindowsOpen -;
Я не определил numWindowsOpen перед функцией, поэтому по какой-то причине этот вызов происходил несколько раз .. Кто-нибудь может объяснить, почему это происходило?
Решение 2
Проблема заключалась в том, что numWindowsOpen не был объявлен до того, как его там уменьшили ... Хорошее напоминание, чтобы убедиться, что вы ищите такие простые вещи, прежде чем переходить к более сложным tihngs.
Другие советы
Обратный вызов должен вызываться только один раз для каждого элемента, соответствующего селектору. Видите ли вы несколько предупреждений при помещении сообщения с предупреждением прямо в обратный вызов?
function() {
alert('Test');
resetWindow(windowIdPrefix);
numWindowsOpen--;
}