2012-02-08 100 views
0

我不確定我是否應該清除所有內容或重置某個地方。jQuery鎖定了瀏覽器

發生的事情是,在輸入文本框中設置一個int值時,瀏覽器將鎖定10 - 30秒。

這裏是一個小片段:

function RunIt() { 
    $('#txTotW').bind('keyup', function() { 
     _totWidth = parseInt($(this).val()); 
     $('#totalWidth').text($(this).val()); 
     RunIt(); 
    }); 
    $('#txTotH').bind('keyup', function() { 
     _totHeight = parseInt($(this).val()); 
     RunIt(); 
    }); 
    $('#txBayCnt').bind('keyup', function() { 
     _bayCount = parseInt($(this).val()); 
     RunIt(); 
    }); 
} 

如果在任何時候KEYUP的事件之一是火我通過.find('tr').remove()重建一個表,這個表只有三行最大在任何時間,但由於變化一個值的整個表將被重建。

這似乎不是一個足夠大的負載,使瀏覽器鎖定。

我能做些什麼來解決這個問題?

+0

也許下次您可以學習格式化代碼並正確標記您的問題。謝謝。你還有意錯過'RunIt()'函數的大括號('}')。再次關注細節在我們的網站上很重要。 – Kev 2012-02-08 00:59:15

+0

運行後不需要重新創建綁定。在我看來,你可以在函數中刪除對RunIt()的調用。 – millimoose 2012-02-08 01:02:59

+2

@Kev不需要那麼居高臨下;雖然我同意格式化很重要,但這是大衆在這裏的第一個問題,而且您可以輕鬆地以不同的方式表達您的建議。 – btown 2012-02-08 01:08:31

回答

1

當您將函數綁定到jQuery中的事件時,它會永久存儲在數據結構中,作爲在該事件被調用時總是會發生的行爲(除非您顯式刪除綁定)。因此,當您從這些回調/處理程序中調用RunIt()時,您正在爲該結構添加冗餘功能。造成這種情況的原因是冗餘回調的數量呈指數增長:每個事件的前1個,然後是2,然後是4,然後是8,依此類推。你根本不需要從這些回調中調用RunIt():綁定仍然存在。

+0

謝謝大家的解答和幫助。深入挖掘後,我不得不花費一個月的時間來抓建設者和關閉。我有一個c#背景,所以使用引用是一個挑戰,現在已經轉移到有趣的。 – 2012-04-04 18:39:36

0

您在每個回調中呼叫RunIt()。這是遞歸的,並且您正在以指數方式增加調用次數的循環結束。一個簡單的解決方案是將參數添加到RunIt(),以便您只將這些回調分配給相關行。

澄清,是的,它只是綁定RunIt()到每個電話。但是,每次調用相同的函數時,都是重新綁定。通過重新綁定,您可以使其重複現有行的回調函數(每行可以獲得多個回調函數,而不是單個回調函數)。因此,在這種情況下(3種方法),每種方法都被綁定,然後調用所有3種方法,最後得到1 + 2 + 3次調用,總共多6次綁定,所以下次調用它時,就是6 + 7 + 8這些調用會添加更多數量的綁定,並隨着您添加行而不斷增長,直到它幾乎無法管理爲止,就像您所經歷的那樣。

+4

它不會形成無限循環,但它的綁定就像* gazillion *匿名回調。 – 2012-02-08 00:56:32