2014-01-16 79 views
0

我做了一個自定義燈箱。調用它的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()方法,但它很密集。

+0

有沒有足夠的代碼在這裏看到相當如何你收藏的作品,但你確定觸發不是以某種方式再次調用Close方法,造成死循環? – RichieAHB

+0

是的,絕對。如果是這種情況,那麼調用'.triggerHandler()'而不是'.trigger()'應該具有相同的效果。此外,循環不是無限的有時。 昨天當我測試我沒有得到任何錯誤,但是現在我大部分時間都有錯誤。 – turibe

回答

0

jQuery本身似乎是導致遞歸。

請注意這裏的區別。 .trigger()導致發生觸發事件處理程序觸發的操作,而.triggerHandler()僅觸發事件處理程序。我很驚訝jQuery數字尋找一個.close()方法,當我.trigger()關閉事件,但不過是發生了什麼。

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