【问题标题】:Fastest way to loop through thousands of form elements in Javascript在 Javascript 中循环数千个表单元素的最快方法
【发布时间】:2013-01-04 04:25:42
【问题描述】:

我正在尝试遍历数千个 javascript 元素。特别是复选框和选择。复选框需要在选中/取消选中之间切换,并且选择需要根据是否选中主复选框来禁用/启用。

 <script>
 function processFormElem(min, max, isChecked) {
    for (var i=min; i < max; i++) {
        document.getElementById('chkbox_'+i).checked = isChecked;
        document.getElementById('select_'+i).disabled = !(isChecked);
    }
}
</script>

 Check this: <input onchange='processFormElem(0,10000,this.checked);' type='checkbox'  value = '0'><br/><br/>

 <?php
 for ($i=0; $i < 10000; $i++) {
     echo "Check: <input type='checkbox' id='chkbox_$i' value = '1'> ";
     echo "Select: <select disabled='disabled'  id='select_$i'><option selected>1<option>xyz</select><br/>";
 }
 ?>

这段代码完成了所需的工作,但处理表单元素的速度非常慢,我可以注意到滞后。有什么办法让它更快?

【问题讨论】:

  • “我正在尝试遍历数千个 javascript 元素” - 为什么? “它非常慢”嗯是的......“有什么办法让它更快吗?”不要遍历数千个元素。
  • 几千个表单元素?在我看来,这听起来有点设计缺陷。你能解释一下为什么在一页上需要几千个表单元素吗?
  • 网页上有 10000 个元素?客户端脚本中有这么大的循环没有办法大大加快速度
  • 也许你可以使用 setTimeout/Interval 将循环分成更小的循环。
  • 此页面是否用作增强审讯技术?

标签: javascript


【解决方案1】:

如果您的复选框和选择框都紧随其后,请尝试使用nextElementSibling。问题是 document.getElementById 必须搜索 DOM 树中的每个元素以找到具有匹配 ID 的元素(尽管底层实现可能使用哈希表或其他东西来提高 ID 查找性能)

无论哪种方式,使用 nextElementSibling 都可以让您像遍历树一样遍历元素,从而节省查找时间。

例如:

var cb = document.getElementById('chkbox_' + min),
    sb = document.getElementById('select_' + min);
while (cb !== null && sb !== null) {
    cb.checked = isChecked;
    sb.disabled = !isChecked;

    cb = cb.nextElementSibling;
    sb = sb.nextElementSibling;
}

编辑:

正如 David 在下面指出的,并非所有浏览器都支持 nextElementSibling。您可以使用 nextSibling 解决这个问题。

代替:

cb = cb.nextElementSibling;

做:

while(cb !== null && cb.nodeName != 'Element') { cb = cb.nextSibling; }

话虽如此,不支持 nextElementSibling 的浏览器每天都在变得越来越少,而 nextSibling 解决方案也有很多自己的开销。如果您想支持旧版浏览器,这取决于您(或可能是您的老板)。

【讨论】:

  • @David:好点;使用备用向后兼容的解决方案进行编辑。
  • @Derek:他似乎使用的是纯 JavaScript,而不是 JQuery。我保证下一个函数是我上面提出的解决方案的一个精简包装,除了它还有所有不必要的 JQuery 开销。
【解决方案2】:

我认为在这里使用 Jquery 会更好:

$(':checkbox').each(function () {  
    this.checked = isChecked; 
});
//isChecked-true/false

希望一切顺利。

【讨论】:

  • 这会变慢有几个原因:1)标准的 JQuery 开销; 2)选择器将首先将所有匹配元素收集到一个数组中(非常慢); 3) 函数创建/关闭开销(将变量从父函数添加到匿名函数的作用域); 4)函数评估开销(你必须调用函数,这本身就是一个步骤)
猜你喜欢
  • 2012-08-09
  • 2017-09-09
  • 1970-01-01
  • 2010-12-07
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
相关资源
最近更新 更多