我制作了一个自定义灯箱。调用它的close方法直接在Lightbox对象上触发close事件。在关闭方法中使用.trigger()
会导致灯箱关闭之前出现明显延迟,并在尝试关闭灯箱时使页面无响应。我知道通过分析dev工具中的函数运行时,close方法是递归调用的,但它不会抛出“太多的递归”错误。
使用jQuery的.triggerHandler()
方法不会导致此递归问题。我从中了解到,并且通过查看代码,close事件的所有事件侦听器都没有调用Lightbox的close()
方法。此外,在Lightbox的open()
方法中使用完全相同的技术,事件名称为open.lb
,不会导致任何问题。
以下是Lightbox类的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();
}
});
},
我查看了jQuery的.trigger()
方法的代码,但它非常密集。
答案 0 :(得分:0)
jQuery本身似乎导致了递归。
请注意这里的区别。 .trigger()
导致触发事件处理程序触发的动作,而.triggerHandler()
仅触发事件处理程序。当我.close()
关闭事件时,我很惊讶jQuery数字会寻找.trigger()
方法,但这仍然是正在发生的事情。