2014-01-16 4 views
0

Я создал пользовательский лайтбокс. При вызове метода close метод запускает событие close непосредственно на объекте Lightbox. Использование метода .trigger() в методе «закрыть» вызывает значительную задержку до закрытия лайтбокса и делает страницу неактуальной при попытке закрыть лайтбоксы. Я знаю, анализируя функцию в инструментах dev во время ее запуска, что метод close вызывается рекурсивно, но он НЕ выбрасывает ошибку «слишком много рекурсии».Метод jQuery .trigger() вызывает глубокую рекурсию

Использование метода jQuery's .triggerHandler() не вызывает этой проблемы с рекурсией. Я знаю из этого, а также просматривая код, что ни один из прослушивателей событий для события close не вызывает метод close() Lightbox. Кроме того, используя тот же метод в методе open() Lightbox, с open.lb для имени события, не вызывает никаких проблем.

Это код метода close() класса Лайтбокс.

close: function (callback) { 
    this.opened = false; 
    var self = this; 
    this.$self.trigger('close.lb'); 
    this.cover 
     .stop() 
     .animate({opacity: 0}, Lightbox.ANIMATION_SPEED); 
    this.element 
     .stop() 
     .animate({ 
      opacity: 0, 
      height: 0 
     }, Lightbox.ANIMATION_SPEED, function() { 
      self.cover.add(self.element).removeClass('active'); 
      if (callback) { 
      callback(); 
      } 
     }); 
}, 

Я посмотрел на код .trigger() метода JQuery, но это довольно плотными.

+0

Там не хватает кода здесь, чтобы увидеть, как ваши довольно LightBox работает, но вы уверены, что триггер не вызывая близкий метод снова каким-то образом и вызывает бесконечный цикл? – RichieAHB

+0

Да, определенно. Если это так, то вызов '.triggerHandler()' вместо '.trigger()' должен иметь тот же эффект. Кроме того, цикл не бесконечен. НЕКОТОРЫЕ. Вчера, когда я тестировал, у меня не было никаких ошибок, но сейчас я получал ошибки большую часть времени. – turibe

ответ

0

jQuery сам по себе вызывает рекурсию.

Обратите внимание на разницу здесь. .trigger() вызывает действие, которое запускает обработчики событий, тогда как .triggerHandler() запускает только обработчики событий. Я удивлен, что цифры jQuery ищут метод .close(), когда I .trigger() событие закрытия, но это тем не менее то, что происходит.

http://api.jquery.com/triggerHandler/

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