2009-08-05 2 views
0

Мой метод выцветает ящик Див, и имеет функцию обратного вызова, который вызывает метод ... как это:JQuery fadeOut выполняет обратный вызов снова и снова, почему это и как я могу предотвратить это?

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

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

Когда это исполняет (OnClick кнопки) У меня есть предупреждение в resetWindow, чтобы увидеть, как много раз он выполняется.

Кажется, выполняется навсегда, но я не сидел там достаточно долго, закрывая окна оповещения, чтобы узнать.

Я сделал некоторые исследования и читать в документации Jquery:

CallBack (опционное) Функция
Функция, которая будет выполнена, когда анимация завершается, выполняется один раз для каждого элемента анимационного против.

Так мне было интересно, хотя я только выведении 1 Div, это считается 1 .. плюс 1 для каждого дочернего элемента, DIV имеет?

Технически они анимируются, потому что внутренние элементы исчезают с помощью внешнего div, но если вы смотрите javascript в firebug, только внешний div, который я угасаю, становится прозрачным/отображенным.

Если это то, что происходит, как я могу убедиться, что обратный вызов выполняется только один раз?

Edit: Это была линия numWindowsOpen--; я не определил numWindowsOpen перед функцией так по какой-то причине, которая делает вызов случается несколько раз ... Может кто-нибудь объяснить, почему это происходит?

+0

Можете ли вы опубликовать код для resetWindow? – Powerlord

+0

Это просто предупреждение, но я добавил его в любом случае. – Matt

+0

Если вы входите в console.log ($ ("#" + windowIdPrefix + "_ViewPanel"). Length); перед линией fadeOut, что вы получаете? (или сделать предупреждение вместо console.log, если у вас нет firebug) – jammus

ответ

0

Проблема в том, что numWindowsOpen не был объявлен до его декрементируется там ... Хорошее напоминание, чтобы убедиться, искать простые вещи, как, что, прежде чем идти к более сложным tihngs.

0

Обратный вызов должен вызываться только один раз для каждого элемента, который соответствует селектору. Вы видите несколько предупреждений при отправке предупреждающего сообщения непосредственно в обратном вызове?

function() { 
    alert('Test'); 
    resetWindow(windowIdPrefix); 
    numWindowsOpen--; 
} 
+0

Добавление в alert ('Test'); делает тестовое оповещение один раз (независимо от того, находится ли там fadeOut). Из того, что вы написали (без fadeOut), функция resetWindow выполняется только один раз. Это только тогда, когда fadeOut находится там, где resetWindow выполняется несколько раз – Matt

Смежные вопросы