Я создал пользовательский лайтбокс. При вызове метода 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, но это довольно плотными.
Там не хватает кода здесь, чтобы увидеть, как ваши довольно LightBox работает, но вы уверены, что триггер не вызывая близкий метод снова каким-то образом и вызывает бесконечный цикл? – RichieAHB
Да, определенно. Если это так, то вызов '.triggerHandler()' вместо '.trigger()' должен иметь тот же эффект. Кроме того, цикл не бесконечен. НЕКОТОРЫЕ. Вчера, когда я тестировал, у меня не было никаких ошибок, но сейчас я получал ошибки большую часть времени. – turibe