2011-10-05 85 views
94

我在chrome上收到錯誤「Uncaught RangeError:Maximum call stack size exceeded」。這裏是我的jQuery功能Chrome/jQuery未捕獲RangeError:超出最大調用堆棧大小

$('td').click(function() { 
     if ($(this).context.id != null && $(this).context.id != '') { 
      foo($('#docId').val(), $(this).attr('id')); 
     } 
     return false; 
    }); 

請注意,頁面中有成千上萬的單元格。但是,我通常會將堆棧溢出與遞歸聯繫起來,並且在這種情況下,據我所見,沒有任何溢出。

創建一個這樣的lambda是否會自動生成一堆堆棧中的東西?有沒有辦法繞過它?

目前唯一的解決方法是在呈現HTML時使每個單元格明確生成onclick事件,這使得HTML變得更大。

+2

你確定foo函數沒有遞歸嗎?如果您刪除該函數調用,錯誤是否仍然發生? – sth

+1

它在其他瀏覽器中按預期工作嗎?當你評論'foo($('#docId').val(),$(this).attr('id'));'line? - 額外的性能提示:緩存選擇器的結果 - 例如將$(this)的結果保存在一個變量中,並根據需要在整個處理程序中使用它。 – WTK

+0

我有類似的問題,但需要mouseenter事件。當使用身體或表格我沒有得到足夠的事件。 – ericslaw

回答

113

由於「頁面中有數以萬計的單元格」將點擊事件綁定到每個單元格會導致可怕的性能問題。有一個更好的方法來做到這一點,即將點擊事件綁定到主體&,然後找出單元元素是否是點擊的目標。就像這樣:

$('body').click(function(e){ 
     var Elem = e.target; 
     if (Elem.nodeName=='td'){ 
      //.... your business goes here.... 
      // remember to replace $(this) with $(Elem) 
     } 
}) 

這種方法不僅會爲本地「TD」標籤,但也與後來的附加「TD」做你的任務。我想你會有興趣在這篇文章中關於event binding & delegate


或者你可以簡單地使用jQuery的「.on()」方法具有相同效果:

$('body').on('click', 'td', function(){ 
     ... 
}); 
+0

謝謝,無論如何,我們正在努力爭取這方面的表現,所以這是一個好主意:-) – Andy

+57

Nooo,不要使用.live()!!! http://bitovi.com/blog/2011/04/why-you-should-never-use-jquery-live.html使用.delegate()(或.on(),如果你的jQuery足夠新的話),以及從表級代表而不是整個文檔。這會比使用.live()更好地提高你的性能,這實際上只是將整個文檔委託給它。 – brandwaffle

+17

而.live已經從jQuery 1.9中移除了 – cpuguy83

3

此問題發生與我,當我在網站中使用jQUery Fancybox以及許多其他jQuery插件。 當我使用LightBox(site here)而不是Fancybox時,問題消失了。

28

當你有無限循環時,你也可以得到這個錯誤。確保你沒有任何無限的,遞歸的自引用。

+3

這解決了我的問題。我在'drinkBeer()'中有'Drink',和'$('#linkDrink')。click();''。 –

4

礦是更多的一個錯誤,發生了什麼是循環點擊(我猜)基本上通過點擊登錄父母也被點擊,最終導致超過最大調用堆棧大小。

$('.clickhere').click(function(){ 
    $('.login').click(); 
}); 

<li class="clickhere"> 
    <a href="#" class="login">login</a> 
</li> 
1

U可以使用

$(document).on('click','p.class',function(e){ 
    e.preventDefault(); 
     //Code 
    }); 
0

我只是最近就遇到了這個問題爲好。我在對話框中有一個非常大的表格。它是> 15,000行。當在對話框div上調用.empty()時,我得到了上面的錯誤。

我發現了一個回合的解決方案,在我調用清理對話框之前,我會從非常大的表中刪除其他所有行,然後調用.empty()。它似乎雖然工作。看來,我的舊版本的JQuery不能處理這樣的大元素。

相關問題