jQuery .trigger()方法导致深度递归

时间:2014-01-16 09:41:37

标签: javascript jquery recursion

我制作了一个自定义灯箱。调用它的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()方法的代码,但它非常密集。

1 个答案:

答案 0 :(得分:0)

jQuery本身似乎导致了递归。

请注意这里的区别。 .trigger()导致触发事件处理程序触发的动作,而.triggerHandler()仅触发事件处理程序。当我.close()关闭事件时,我很惊讶jQuery数字会寻找.trigger()方法,但这仍然是正在发生的事情。

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