2011-04-19 96 views
-1

我的JS函數有問題。我會用我的代碼和Prt Sc向你解釋。使用javascript禁用多個複選框

代碼= http://jsfiddle.net/dKeRf/

這是一個PHP函數和JS功能。

屏幕= http://img824.imageshack.us/i/antoe.png/

如果2複選框過表中的一個被選中時,在這兩個表中的所有的複選框必須被禁止。目前它適用於第一個複選框,但不適用於第二個複選框,我問你爲什麼? :)

我在我的'For'突出部分中使用'10'進行測試,我將根據表格的行數改變後者。

感謝您的幫助,祝您有美好的一天!

+2

粘貼在這裏,而不是外部源代碼。並且記住要清除它的語法,因爲沒有人喜歡讀雜亂的代碼。 – hsz 2011-04-19 14:10:19

+0

請清理您的代碼 – jimy 2011-04-19 14:19:39

回答

1

添加一個類的所有複選框:

<input class="the_checkbox" id='{unique_id}' name='module[]' type='checkbox' value='{unqiue_value}'> 
<input class="the_checkbox" id='{unique_id}' name='module[]' type='checkbox' value='{unqiue_value}'> 
<input class="the_checkbox" id='{unique_id}' name='module[]' type='checkbox' value='{unqiue_value}'> 
<input class="the_checkbox" id='{unique_id}' name='module[]' type='checkbox' value='{unqiue_value}'> 

然後使用jquery一次更新所有的複選框:

<script> 
$(document).ready(function(){ 
    $(".selectAll").click(function() { 
     if($(".selectAll").attr("checked")) { 
      $(".the_checkbox:checkbox").attr("disabled", true); 
     } else { 
      $(".the_checkbox:checkbox").removeAttr("disabled"); 
     } 
    });   
}); 
</script> 

UPDATE:更改使用的答案。用於更新複選框而不是ID的類名,以便該ID可以保持唯一併符合HTML標準。

+0

感謝您的回答! 但是複選框不能有相同的ID,它不起作用。 我會盡量使用jQuery,這可能會幫助我。 我也會清理我的代碼併發布。 – 2011-04-19 14:33:32

+0

我不確定你的意思是「它不工作」與所有相同的ID。還有什麼你正在做的與身份證,要求他們都不一樣?如果沒有,它會起作用。我已經測試過,所以我知道它可以使用所有相同的ID。按照我上面的例子。給複選框禁用所有其他複選框的類的selectAll(class =「selectAll」),並給予需要禁用cpt2(id =「cpt2」)ID的複選框,並使用我發佈的jQuery代碼,它將工作。 – 2011-04-19 15:06:42

+0

我真的會反對這個建議。根據HTML規範,ids必須是唯一的。雖然是的,但JQuery仍然可以工作,document.getElementById()不會。如果你想學習JavaScript並從JQuery中解脫出來,你需要document.getElementById()。 – 2011-04-19 15:10:11

1

ID不允許以數字開頭,必須以字母開頭。所以document.getElementById(1234)將失敗(我認爲IE可能不會說出任何東西並允許它,但FF不起作用)。只要在號碼前加一個字母並將getElementById更改爲document.getElementById('cb'+id2);即可。

此外,只是一個方面說明,如果您通過this函數onClick,該參數是對被單擊元素的引用。所以沒有必要得到box.id,然後做document.getElementById(checkId)。從技術上說document.getElementById(checkId)是=== box所以你可以只說box.checked

http://www.w3.org/TR/html4/types.html#h-6.2。這是關於ID屬性命名要求的規範:

ID和名稱標記必須以字母([A-Za-z])開頭,後面可以跟隨任意數量的字母,數字([0 -9]),連字符(「 - 」),下劃線(「_」),冒號(「:」)和句點(「。」)。

編輯:

甚至比使用document.getElementById()選擇每個複選框,是使用document.getElementById()父元素所需的複選框以禁用共享(如它們在表)然後使用document.getElementsByTagName('input')獲取所有複選框的集合,並使用該複選框進行循環/禁用。所以JS代碼禁用會是什麼樣子:

一些表:

<input type='checkbox' onClick='checkCBs(this,"someTable1");'> 
<table id='someTable1'> 
    <tr> 
    <td>This is checkbox 1:</td> 
    <td><input type='checkbox' name='group1' value='checkbox1'></td> 
    </tr> 
    <tr> 
    <td>This is checkbox 2:</td> 
    <td><input type='checkbox' name='group1' value='checkbox2'></td> 
    </tr> 
</table> 

代碼:

function checkCBs(box, parent){ 
    var parent = document.getElementById(parent), 
     CBs = parent.getElementsByTagName('input'), 
     i; 
    //loop through all input elements 
    for(i=0;i<CBs.length;i++){ 
     //make sure the input is a checkbox 
     if(CBs[i].type && CBs[i].type=='checkbox'){ 
      //set disabled on this checkbox to opposite 
      //of whether box is checked. 
      CBs[i].disabled = !box.checked; 
     } 
    } 

} 
+0

這似乎是一個優雅的解決方案的開始。無論如何消除for循環?如果不是這樣,至少爲了獲得更好的性能(雖然它可能很小),CBs.length應該是for循環之前的set var,所以您不必爲循環中的每個迭代調用「length」函數。 – 2011-04-19 16:45:09

+0

是正確的,CBs.length應該在循環之前設置,我只是懶惰。至於'for'循環,它是必需的。 DOM中沒有一種方法可以影響集合/對象/數組中的多個元素,而無需循環它們並影響每個單獨的值。即使在JQuery中,您也可以使用一個函數調用來調用它,但它仍然會遍歷這些元素並分別影響每個元素。你可以寫一個函數來爲你做(與使用jQuery相同),但可能沒有什麼好處。 – 2011-04-19 18:00:03

+0

感謝您的幫助喬納森,cdburgess和afuzzyllama,我會嘗試喬納森的解決方案來解決我的問題! parent.getElementsByTagName似乎是一個很好的方法來做到這一點。謝謝 ! – 2011-04-20 07:14:30