2012-02-08 83 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