2009-02-02 88 views
1

我有一個包含數千個複選框的表單,當選中其中一個時,我想檢查它下面的所有框。 這工作:在Javascript中查找對象

<html> 
<body> 
<form name="myform"> 
<input type="checkbox" name="box1" onClick="redrawboxes(this);">1<br> 
<input type="checkbox" name="box2" onClick="redrawboxes(this);">2<br> 
... 
</form> 
</body> 
</html> 
<script> 
function redrawboxes(obj){ 
    //check all boxes below 
    var foundit=false; 
    for (e=0; e<document.myform.elements.length; e++){ 
     if (foundit==false){ //search for checked obj 
      if(obj == document.myform.elements[e]){ 
       foundit=true; 
      } 
     }else{ //continuing below checked box 
      if(obj.checked){ //are we checking or unchecking 
        document.myform.elements[e].checked = true; 
      }else{ 
        document.myform.elements[e].checked = false; 
      } 
     } 
    } 
} 
</script> 

但超過幾千箱,IE是慢得不可接受。 (Firefox工作正常。) 除了遍歷整個列表之外,是否有更好的方法來查找原始框?

+0

我的第一個問題是你到底在做什麼與表單上的數千個複選框? :P – 2009-02-02 21:18:07

+0

這也是我第一個想到的...... D – 2009-02-02 21:33:57

+0

它實際上是一棵樹,有成千上萬的僱員,按部門,紀律,職位分開。我允許任何這些團體或個人選擇。在實際的樹中,它不會選中複選框下的所有內容,當它跳到樹上的某個級別時它會停止。 – 2009-02-03 03:46:42

回答

4

這兩個jQuery建議都很不錯。對於這樣的DOM爭吵,你最好使用一個好的庫。

而關於把成千上萬的複選框窗體上的可疑智慧的評論是相當不錯的,以及...

但是,對你有一個很好的理由這樣做的關機會,你不能使用jQuery或類似的,這裏有一個快速,直JS方法:

function redrawboxes(obj) 
{ 
    //check all boxes below  
    var next = obj; 
    while ((next = next.nextSibling)) 
    { 
     if (next.nodeName.toLowerCase() == "input" 
     && next.type.toLowerCase() == "checkbox") 
     next.checked = obj.checked; 
    } 
} 

在FF3,FF3.1,IE6,Chrome瀏覽器測試1,鉻2

3

我可能會爲此投票,但嘗試使用jQuery。它具有爲此優化的選擇器。

2

裏面的廣告!

如果你正在使用jQuery,你可以試試我的插件來使你的循環異步,這將允許運行一個很長的循環而不會凍結瀏覽器。

http://mess.genezys.net/jquery/jquery.async.php

如果你不想使用jQuery,您可以下載插件並修改代碼根據自己的需要,它並沒有真正依賴於jQuery的。

2

你可以讀出所選擇的複選框的名字是這樣的:

function redrawboxes(obj) { 
    var name = obj.name; 
    var state = obj.checked; 

    // get that index 
    var index = name.substr(3) * 1; // just to be sure it's a number 
    var length = document.myform.elements.length; 
    var allElements = document.myform.elements 

    // (un)check all elements below 
    for (var i = index; i < length; i++) { 
     allElements[i].checked = state; 
    } 
} 

您可以通過使用本地變量頗有幾分加快了您的代碼,並有一個if語句來是可以替代的。

編輯:事實上,一次性錯誤不是一個錯誤,因爲該特定的複選框被用戶自己檢查(un)。

2

說不上有多快,但你可以嘗試jQuery的方式,抓住jQ從www.jquery.com uery,並在頁面上插入下面的代碼:

$(function(){ 
    $("input:checkbox").click(function(){ 
     $(this).nextAll("input:checkbox").each(function(){ 
      this.checked = true; 
     }); 
    }); 
});