2011-09-23 60 views
0

所以我在jQuery中调用一个函数,循环遍历一个表,并确定是否隐藏基于每行内隐藏的表单元素的行。简单的jQuery每个循环使浏览器挂起

当我运行这个脚本,以任何一种方式切换行时,即使行数少于100行,浏览器也会挂起至少5秒钟。

js的看起来像这样:

$('input.vv').each(function(index) { 
     var chk = $(this).val(); 
     if (chk == "0") $(this).parents("tr").slideToggle(function() { 
      tableRows(); 
     }); 
     }); 

,并从HTML样本行看起来像这样:

<tr class="sortable part item" id="row803"> 
<td class="col-check">Interior Fixed Dome Camera Surface Mounted<br />(Panasonic Part No. WV-CW484AS/29) 
<input type="hidden" class="vv" value="50" id="v803" /></td> 
    <td class="col-equip cen" id="q803">70</td> 
     <td class="col-equip cen" id="s803">50</td> 
    <td class="col-equip cen"><div id="bom803|092311-001|15" />50</div></td> 
    <td class="col-equip cen" id="b803"><span class="shipped">20</span></td> 
</tr> 

的jquery.js的那萤火指行至是8449

return isNaN(parsed = parseFloat(r)) ? !r || r === "auto" ? 0 : r : parsed; 

我卡住了(不能链接到活网站抱歉)。萤火虫可能会给我一个出路,但我不确定如何使用它足够好。想到任何人?谢谢!

+0

了解'tableRows()'函数的作用是有用的。 –

+0

斑马条纹可见行。但是将其从代码中注释掉对脚本没有影响。 – Alex

回答

1

​​创建一个循环遍历所有投入要素,并检查他们是否是在vv类的一部分。

.parents("tr")循环遍历所有父节点,并且只选择<tr>元素。

然后,您调用.slideToggle,这会产生一个需要大量计算能力(小间隔,通过JQuery进行CSS样式调整,通过浏览器进行CSS样式分析)的效果。 可能是主要原因

最后,你调用tableRows();,你还没有定义。

这些“少于100行”的操作需要很大的计算能力。

+0

我试着用刚刚切换替换slidetoggle并得到相同的laggy结果。 也注释掉了tableRows()函数调用没有改进 – Alex

+0

我已经解释了你的代码。要利用它:通过隐藏注释背后的一部分代码来找到原因('if(example){/ * test()* /}')。 –

+0

是的,我明白我的代码的作用;我写的。完全删除hide操作(slidetoggle,toggle,hide,whatever)可以修复问题,但显然现在我的行​​不会隐藏。所以我将代码从slideToggle改为toggleClass(“隐藏”),全部修复。谢谢您的帮助。 – Alex

0

尝试是多一点具体的:

$('input.vv').each(function(index) { 
    if ($(this).value == "0") $(this).parent().parent().slideToggle(function() { 
     tableRows(); 
    }); 
    }); 
+0

不错的想法,但这似乎没有效果 – Alex