我做了一個自定義燈箱。調用它的close方法直接在Lightbox對象上觸發close事件。在關閉方法中使用.trigger()
會在燈箱關閉之前導致嚴重的延遲,並在嘗試關閉燈箱時使頁面無響應。我從分析開發工具中的函數的過程中知道,它正在運行,遞歸調用close方法,但它不會拋出「太多的遞歸」錯誤。jQuery .trigger()方法導致深度遞歸
使用jQuery的.triggerHandler()
方法不會導致此遞歸問題。我知道這一點,也從代碼中查看關閉事件的事件監聽器都沒有調用燈箱的方法close()
。另外,在Lightbox的open()
方法中使用完全相同的技術,使用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();
}
});
},
我看了jQuery的代碼.trigger()
方法,但它很密集。
有沒有足夠的代碼在這裏看到相當如何你收藏的作品,但你確定觸發不是以某種方式再次調用Close方法,造成死循環? – RichieAHB
是的,絕對。如果是這種情況,那麼調用'.triggerHandler()'而不是'.trigger()'應該具有相同的效果。此外,循環不是無限的有時。 昨天當我測試我沒有得到任何錯誤,但是現在我大部分時間都有錯誤。 – turibe